PHPでバックグランドで処理させたいと考えています。
300通前後のメールを一括送信するために、この送信処理をバックグランドで処理させたいと考えています。
色々調べて、
system()関数とexec関数を知りました。
しかし、動きが上手くいきません。解決策や糸口をご教授頂けないでしょうか?
メールを送るファイル: back.php
フロントで実行するファイル:mai.php
で下記の様に書きました。
back.php
<?php
require_once('Mail.php');
$params = array(
"host" => "smtp.gmail.com",
"port" => 587,
"auth" => true,
"username" => "****@gmail.com",
"password" => "****"
);
$mailObj = Mail::factory("smtp",$params);
mb_language('ja');
mb_internal_encoding('utf-8');
$rec ='**_com2@yahoo.co.jp';
$header = array(
"To"=>$rec,
"From"=>"admin@**-terakoya.jp",
"Subject"=>mb_encode_mimeheader('これは件名')
);
$com = 'メール本文';
$com = mb_convert_encoding($com,"UTF-8","auto");
$mes =$mailObj -> send($rec,$header,$com);
if(PEAR::isError($mes)){
echo '<pre>';
var_dump($mes->getMessage());
echo '</pre>';
}
?>
実行するファイル
mail.php
var_dump(system("php www/htdocs/ac/back.php > /dev/null &"));
です。
パスの指定方法が問題なのかもしれないと思い色々試してみましたが最終的には無理でした。
ちなみに、本番サーバーの環境とXampp環境では何か違う方法が必要なのでしょうか?
上記例は、本番サーバーで記述した物です。
どうぞご教授お願いします。
No.3ベストアンサー
- 回答日時:
こんにちは。
そもそも、引数が配列で渡っていないです・・・。
$obo =$_POST['ID'];
$ndd ="/usr/local/bin/php /www/htdocs/ac/wp-content/plugins/member/back.php ".$obo;
$ref =system($ndd);
この$oboが配列ですが、$nddの文字列は、
/usr/local/bin/php /www/htdocs/ac/wp-content/plugins/member/back.php Array
と等価です・・・。
標準入力に配列を渡そうとしていますが、これは無理です。
なので、
一度implodeして、何かの区切り文字列で渡して、explodeするとか・・・。
この回答への補足
taka451213様
ありがとうございます!!
お陰様で問題なく解決する事ができました。
>>標準入力に配列を渡そうとしていますが、これは無理です。
標準入力と言う言葉を初めてしりました・・・・勉強不足ですね。
やはり、教えていただいたように、配列は渡っていなくて渡す前に文字列に変換ご、再び配列にするなどの方法で解決しました。
ありがとうございます。
標準入力について調べてみました。
「OSの実行するプログラムをデータを受け取るデフォルトの入口」とあります。
これは、サーバーのOSの事を指していると思うのですが、今一理解できていません。
もしよろしければ、どのような事か教えて頂けませんか?
1つ分かっている事は、標準入力で配列を渡す事は無理と言うことですよね?
いずれにしても本当にありがとうございました。
No.2
- 回答日時:
こんにちは。
うーん・・・、部分的に記述されても、さっぱりわかりません・・・。
ソースコードを書いて、どこがどうおかしいのか、補足して頂けますか?
この回答への補足
申し訳ありません。
説明不足で・・・
下記にソースを書かせて頂きます。
フロントで実行するファイル
mail.php
if($_POST['submit']=='on'){
//var_dump($_POST);
if(isset($_POST['ID'])){
//var_dump($_POST['ID']);
$mailObj = Mail::factory("smtp",$params);
$obo =$_POST['ID'];
$ndd ="/usr/local/bin/php /www/htdocs/ac/wp-content/plugins/member/back.php ".$obo;
$ref =system($ndd);
上記コードはsystem関数を使用するまでの部分です。
メンバーの一覧から選択してsubmitとすると、配列でメールアドレスにつながるためのIDが$_POST['ID']に入ります。
そして、この$_POST['ID']をメールを送信するために使用する(バックグランドで動かすための)back.phpファイルに渡したいと思っています。恐らく、back.phpには配列が渡されていると思うのですが、bakc.phpでその渡された配列をどのように取得すればよいのか分かりません。
下記がback.phpのソースです。
if(!$link=mysql_connect($dbSERVER,$dbUSER,$dbPASS)){
$flag =false;
}else if(!mysql_select_db($dbName,$link)){
$flag =false;
}else if(!mysql_set_charset('utf8',$link)){
$flag = false;
}
$mailObj = Mail::factory("smtp",$params);
if($flag ==true){//DBの接続
foreach($argv[1] as $values){
$posted = "SELECT user_nicename,user_email FROM hogehoge";
$posted = sprintf("SELECT user_nicename,user_email FROM hogehoge1 WHERE ID='%d'",mysql_real_escape_string($values));
$query = mysql_query($posted,$link);
while($row = mysql_fetch_array($query,MYSQL_NUM)){
mb_language('ja');
mb_internal_encoding('utf-8');
$returnMail ='hogehoge@gmail.com'; //get_option('from_mail');
$subject ='テストメール';//get_option('mail_subject');
$rec =$argv[1][0];//$posted[0]['user_email'] ;
----省略(メールを飛ばすソース)-----
var_dump($argv[1][0]);
最後にvar_dumpしている物の返り値が
string(1) "A" string(13) "string(1) "A""
と言う返り値です。
mail.phpからメールアドレスを1つだけ渡して、1つのメールアドレスを送信するようにback.phpを変更すれば、メールは飛ばされます。
上記のことから、引数は渡っていると思うのですが、引数が配列になった場合の取り出し方が分かりません。
原因はわかりますでしょうか?
宜しくお願いします。
No.1
- 回答日時:
こんにちは。
上手くいっていない・・・というのは、
どこがどのように上手くいっていないのでしょうか?
mail.phpからの呼び出しは大丈夫なように見えますが?
この回答への補足
回答ありがとうごじます。
説明不足で申し訳ありません。
現在段階では、質問にある内容はクリアしてback.phpはsystem関数の呼び出しにより動いてくれているようです。
結局パスの指定方法の問題だったようです。
ただ、新たに問題が発生しておりよろしければご教授頂きたいのですが、
system関数から引数を渡しています。
この引数はDBからメールアドレスを取得するためのIDが配列で入っています。
array(
[0]=>320
[1]=>321
....
)
と言った形です。
それで色々調べたのですが、system関数からの引数は配列になった状態になるため、連想配列と言う形になると考えたました。
そこで、$argv[1]でIDが入った配列をback.phpでループさせて配列の値を取り出したいと考えたのですが、ここが上手くいきません。
back.phpのサイトで、var_dump($argv[0][1])として、mail.phpで結果を受け取ってみると
string(1) "A" string(13) "string(1) "A""
と表示されます。
渡している配列は
array(
[0]=>320
)
です。
原因はなんでしょうか?
ちなみに、bakc.phpに直接メールアドレスをmail.phpからsystem関数を使って渡すと、問題なく送信されます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
include先でのinclude元の変数...
-
別ファイルの変数を呼び出した...
-
PHP⇒MySQL CSVファイルのアッ...
-
phpinfo.phpを開くとファイルの...
-
mysqlの自動バックアップ
-
fputcsvで保存せず、そのまま出...
-
透過PNGが透過されない!!
-
データベースへの持続的接続
-
onedrive にexcelファイルをア...
-
MySQLのdatetime型の月日0を削...
-
ラッパークラスって何ですか?
-
.phpと.incファイルの違いはな...
-
ファイルの行数取得
-
バッチを用いたフォルダの自動移動
-
Subversionのリポジトリの削除
-
リンク先を隠す方法はないでし...
-
FTPコマンドでディレクトリごと...
-
PHPで新しいウインドウで開く命...
-
FORMで送信ボタンと戻るボタン...
-
PHPにて外部サイト内容が取得不...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別ファイルの変数を呼び出した...
-
include先でのinclude元の変数...
-
別PHPファイルに変数を渡す
-
シェルスクリプトからphpファイ...
-
phpinfo.phpを開くとファイルの...
-
phpの開始タグ及び終了タグ外で...
-
パスワード等が記述されているp...
-
phpのプログラムエラー
-
拡張子なしのファイルを稼働さ...
-
a href リンクタグでだけで 送...
-
1行目の#! "C:\\xampp\\php\\p...
-
codeigniterでcron実行したい
-
PHP(.php)及びJavascrpit(.j...
-
こちらはただの直列処理ですか?
-
phpのソースコードが、そのまま...
-
リクエストURIによってHTML表示...
-
PEARのmimeDecodeでメール解析...
-
入力フォームの空白や改行を制...
-
拡張子php画像をbmp画像等に変...
-
#!/usr/local/bin/phpはどこに...
おすすめ情報