アプリ版:「スタンプのみでお礼する」機能のリリースについて

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環境では何か違う方法が必要なのでしょうか?
上記例は、本番サーバーで記述した物です。

どうぞご教授お願いします。

A 回答 (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つ分かっている事は、標準入力で配列を渡す事は無理と言うことですよね?

いずれにしても本当にありがとうございました。

補足日時:2010/12/18 17:56
    • good
    • 0
この回答へのお礼

goo教えての使いかたが分かっていなくて、お礼入力する事を補足で売ってしまいました。
改めて、ありがとうございました。

お礼日時:2010/12/18 17:58

こんにちは。



うーん・・・、部分的に記述されても、さっぱりわかりません・・・。
ソースコードを書いて、どこがどうおかしいのか、補足して頂けますか?

この回答への補足

申し訳ありません。
説明不足で・・・


下記にソースを書かせて頂きます。

フロントで実行するファイル
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を変更すれば、メールは飛ばされます。
上記のことから、引数は渡っていると思うのですが、引数が配列になった場合の取り出し方が分かりません。

原因はわかりますでしょうか?
宜しくお願いします。

補足日時:2010/12/17 00:21
    • good
    • 0

こんにちは。



上手くいっていない・・・というのは、
どこがどのように上手くいっていないのでしょうか?

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関数を使って渡すと、問題なく送信されます。

補足日時:2010/12/16 02:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!