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で質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- PHP ECCUBE4のページ管理でPHPを実行させたい 1 2023/04/06 11:42
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのソースコードが、そのまま...
-
エラーundefined function sqli...
-
空メールからの標準入力が受け...
-
MySQLの配置が変わったため、db...
-
シェルスクリプトからphpファイ...
-
別PHPファイルに変数を渡す
-
php 完了画面の送信メールのコ...
-
TCPDFについて
-
CFileDialogの最初のディレクト...
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
phpのftp_get()でエラーが出ます。
-
phpでget_headers()が使えない?
-
Content-Typeが機能していない?
-
awsにApacheとPHPを入れて、何...
-
XAMPPでApacheが起動しなくなり...
-
PHPのif文でその処理を途中で抜...
-
ワードプレスサイト PHP8.0.25...
-
拡張子php画像をjpg画像等に変...
-
mb_send_mail関数が利用出来ない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別ファイルの変数を呼び出した...
-
MySQLの配置が変わったため、db...
-
入力フォームの空白や改行を制...
-
別PHPファイルに変数を渡す
-
シェルスクリプトからphpファイ...
-
phpのソースコードが、そのまま...
-
include先でのinclude元の変数...
-
phpinfo.phpを開くとファイルの...
-
拡張子php画像をbmp画像等に変...
-
PHPから別なPHPへ移動(?)する方法
-
PerlからPHPの呼び出しについて
-
1行目の#! "C:\\xampp\\php\\p...
-
パスワード等が記述されているp...
-
ローカルでは動くがサーバーで...
-
PHPの拡張子を見せない方法
-
#!/usr/local/bin/phpはどこに...
-
PHP(.php)及びJavascrpit(.j...
-
.htaccessの設定で,auto_prepe...
-
.phpのファイルを開けない!
-
拡張子なしのファイルを稼働さ...
おすすめ情報