- 締切済み
phpで外部phpを稼働させる方法について
初心者です、宜しくお願いします。 外部でメールを送信するプログラムを利用者にストレスが無いようにバックグラウンドで稼働させたいと考えています、 自分なりに調べて、exec関数でテストプログラムを作ってみましたが記述の方法に誤りがあるのか動きません、 sampleプログラム (test.php) <?php exec("nohup php -c '' 'sendmail.php' > /dev/null &"); ?> sendmail.phpは自分宛に送信するよう簡単に作ったプログラムで test.phpと同じディレクトリに設置してあります、 単独で実行するときちんと届きます、 パーミッションは双方とも、604に設定してあります。 どなたかご教授いただけると助かります。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10359)
>php.iniの設定を合わせておけば同じ動作をしてくれる.... >と認識しておりましたが 誤りでしょうか? Windowsで開発したPHPのコードはかならずLinux/Unixサーバーでも動くか? と言う意味なら、誤りですね。 OSに依存する機能を呼び出したら互換性がありません。 OSに依存しない範囲でコードを書けば互換性がありますので、そのまま他のOSでも動きます。 プロセス関連のようなOS依存の機能を使ったり、PHPから外部コマンドを呼び出したりするなら、OSを同じにしてください。
- notnot
- ベストアンサー率47% (4900/10359)
>C:\xampp\htdocs\test\writing_test.php サーバーはWindowsなんですか?Windowsサーバーってよくわからない。 nohupコマンドって、Windowsには元々入ってませんが、別途インストールしたのでしょうか? もしnohupが無いとすると、「Windows バックグラウンド」で検索すると下記の情報がありました。 http://ml.php.gr.jp/pipermail/php-users/2007-September/033096.html これを元にして、 $fp= popen('start /B cmd /c "php.exeのフルパス /xampp/htdocs/test/writing_test.php"',"r"); if( !$fp ) die("Can't exec"); pclose($fp);
お礼
いつもありがとうございます、 宜しくお願い致します。
補足
ローカルサーバーの環境は windows7 に XAMMPをインストールしたものです Apacheと同環境..と言うかApacheその物で動かしている.... レンタルのWEBサーバーに移設しても php.iniの設定を合わせておけば同じ動作をしてくれる.... と認識しておりましたが 誤りでしょうか?
- notnot
- ベストアンサー率47% (4900/10359)
>exec("nohup php'http://localhost/process/writing_test.php' > &"); それはURLです。ファイル名をフルパスで書いてください。 exec("nohup php /xxxxx/yyyyy/zzzzz/process/writing_test.php &"); みたいな。 あなたが設置場所として書いたものの見方がわからないので、具体的に何と書くかはアドバイスできません。 >exec("nohup php'http://localhost/process/writing_test.php' > &"); また、php の後には空白が必要 > は不要。タイプミス多すぎで他も心配ですね。
お礼
ありがとうございます。
補足
ご指導ありがとうございあます ローカルサーバーのhtdocs直下にtestディレクトリを新たに作りテストしてみたんですが... (1) 実行させたいプログラム(writing_test.php)に <?php echo __FILE__ ?> と記述して単独実行すると表示されたパスが C:\xampp\htdocs\test\writing_test.php (2) (writing_test.php)を簡単なテキスト書き出しプログラムに書き直して 同ディレクトリに(test.php)を設置、 (test.php)に(1)で表示されたパスを元に以下のソースを記述して試しましたがすべて駄目でした。 exec("nohup php C:/xampp/htdocs/test/writing_test.php &"); exec("nohup php /xampp/htdocs/test/writing_test.php &"); exec("nohup php /htdocs/test/writing_test.php &"); exec("nohup php /test/writing_test.php &"); exec("nohup php /writing_test.php &"); exec("nohup php C:\xampp\htdocs\test\writing_test.php &"); exec("nohup php \xampp\htdocs\test\writing_test.php &"); exec("nohup php \htdocs\test\writing_test.php &"); exec("nohup php \test\writing_test.php &"); exec("nohup php \writing_test.php &");
- notnot
- ベストアンサー率47% (4900/10359)
>単独で実行するときちんと届きます、 これは、具体的にどういう操作で確認しましたか?具体的に書いてください。 >exec("nohup php -c '' 'sendmail.php' > /dev/null &"); exec("nohup php 'sendmail.phpのフルパス' &"); では?
お礼
ご返信ありがとうございます、
補足
sendmail.phpの単独実行は サーバーに設置したsendmail.phpにブラウザで直接アクセスして実行させました、 exec("nohup php 'sendmail.phpのフルパス' &"); ローカルサーバーにて簡単なテキストを書き出すプログラムで試してみたんですがダメでした、 フルパスの認識に誤りがあるのでしょうか? 設置場所 [xampp:htdocs] | [site-name] |-[process] | ----[ test.php ]←execを記述したファイル | ----[ writing_test.php ]←稼働させたいプログラム 記述したソース exec("nohup php'http://localhost/process/writing_test.php' > &");
お礼
いつも、ご丁寧な回答をしていただき 本当にありがとうございます。 今後とも宜しくお願い申し上げます。
補足
先程、テスト結果を書き忘れてしまいましたが > $fp= popen('start /B cmd /c "php.exeのフルパス /xampp/htdocs/test/writing_test.php"',"r"); if( !$fp ) die("Can't exec"); pclose($fp); 前回のテスト同様にパスを試みましたが結果は同じでした、 exec()に固執せず他の方法も探してみたいと思います。 今回は、一旦 外部のプログラム(前記述のwriting_test.php)がさほど処理に時間のかかるものではありませんので (前記述のtest.php)に記述して使うことにいたしますが、この質問は、当面このまま回答募集のままにさせて頂きます。