質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

Q&A

解決済

3回答

4744閲覧

phpのexecで外部スクリプト起動したい

mugen

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

0グッド

2クリップ

投稿2017/09/27 06:25

編集2017/10/10 05:21

###前提・実現したいこと
phpで作られた既存のシステムを最近別サーバー(ウェブアリーナ)に移行しました。
もともとシステムにexecで外部スクリプトを実行するものが組み込まれていて、
移行前のサーバーでは問題なく動いていました。

ところが移行先のサーバーではexecが動いていませんでした。

execで外部スクリプトを実行する部分はphpファイルの中に以下の記述があります。

exec('php /virtual/exectest/exectest.php > /dev/null &');

これが動かなかったので以下で試してみました。

chmod("/virtual/exectest/log", 0755); exec('php /virtual/exectest/exectest.php > /dev/null &', $output, $return_var); var_dump($output,$return_var);

array(0) { } int(0)と帰ってきましたがexectest.phpは実行されていなさそうです。
chmodの返り値はtrueだったので成功していると思います。

実行するexectest.phpの方にはログファイルを作る処理をしています。

error_log('message', 3, '/virtual/exectest/test.log');

直接exectest.phpにアクセスするとログファイルが作成されるのですが、
execの方では作成されませんでした。

###試したこと
上記コードでダメだったので以下のコードを試してみました。

exec('nohup php /virtual/exectest/exectest.php 2>&1', $output, $return_var); var_dump($output); var_dump($return_var);

返り値は以下の通りです。

array(13) { [0]=> string(23) "Content-type: text/html" [1]=> string(0) "" [2]=> string(10) "array(4) {" [3]=> string(7) " [0]=>" [4]=> string(26) " string(11) "Status: 404"" [5]=> string(7) " [1]=>" [6]=> string(38) " string(23) "Content-type: text/html"" [7]=> string(7) " [2]=>" [8]=> string(14) " string(0) """ [9]=> string(7) " [3]=>" [10]=> string(39) " string(24) "No input file specified."" [11]=> string(1) "}" [12]=> string(8) "int(255)" } int(0)

ファイルが見つからないエラーだと思うのですが
同階層に入れていて見つからないというのも謎で、
$return_varの返り値は0なので正常終了しているということではないのでしょうか?

なぜexecが動かないのか見当もつかないので解決の糸口でもつかめたらと思っています。
よろしくお願い致します。

###追記
①同じ条件でロリポップのサーバーで試してみたところ、問題なく動きました。

なのでそもそもexecが使えないのか?と思い

echo exec('ls -l /virtual/exectest/');

を試すも問題なく表示されました。

②試したことで出たStatus: 404が気になり、require_onceで
execで呼び出すphpと同じパスを入れてみました。

require_once ('/virtual/exectest/exectest.php'); exec('nohup php /virtual/exectest/exectest.php > /dev/null &');

exectest.phpはメールを送るものだけにしました。

mail($to, $subject, $message, $headers);

するとなぜかメールが2通届くようになりました。
これは、require_onceとexecで2回呼び出されているからなのでしょうか?
require_onceを消すとメールは1通も届きません。

なにか気が付いた点があれば教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hotta

2017/09/27 06:34

「execで外部スクリプトを実行する」部分のソースを質問欄に追記してください。
mugen

2017/09/27 06:56

exec('php /virtual/IPアドレス/home/html_test/admin/exectest.php > /dev/null &');です。
hotta

2017/09/27 07:01

「質問欄に」追記してください。また、これは php スクリプトの中に書かれているんでしょうか?(SSI と PHP いずれにも exec があるので)
guest

回答3

0

ベストアンサー

プロバイダ側も「SSI の exec(外部コマンド実行機能)」として回答しているんじゃないでしょうか。「PHP の exec 関数」は、SSI の exec とは全く別物です。

詳しくは公式マニュアルの function.exec.php を参照していただきたいのですが、

注意: セーフモード が有効な場合、safe_mode_exec_dirの中にある
実行プログラムのみ実行可能です。 実際的な理由により、現在、実行
プログラムへのパスに ..を 含めることはできません。

このへんに引っかかっていないかどうかを確認してみてください。

投稿2017/09/27 07:23

hotta

総合スコア1613

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mugen

2017/09/27 09:18 編集

回答ありがとうございます。 そもそもが違っていたんですね! セーフモードはオフになっていました。 ただそうなってくると疑問が残る部分がありまして、 chmod("/virtual/IPアドレス/home/html_test/admin/log", 0755); exec('php /virtual/IPアドレス/home/html_test/admin/exectest.php > /dev/null &', $output, $return_var); var_dump($output,$return_var); としたときに array(0) { } int(0) と帰ってくるのですが正常終了している認識でいいのでしょうか? 実行するexectest.phpの方にはログファイルを作る処理をしています。 error_log('message', 3, '/virtual/IPアドレス/home/html_test/admin/log/test.log'); 直接exectest.phpにアクセスするとログファイルが作成されるのですが、 execの方では作成されませんでした。
hotta

2017/09/27 13:45

その前に chmod() の戻りをチェックしていないようですが、 成功しているんでしょうか?
mugen

2017/09/28 00:32

chmod() 返り値はtrueだったので成功していると思います。
hotta

2017/10/02 23:22

exectest.php の中身は1行だけですか?
mugen

2017/10/02 23:47 編集

以下のメール送信も追加しました。 mail($to, $subject, $message, $headers); でもこちらも動いていないと思います。 直接アクセスするとメールは受信できました。
guest

0

exec('/usr/bin/php ...') とフルパスにしてみてはどうでしょうか。phpがどこにあるか調べて。

投稿2017/10/12 02:44

kodai

総合スコア759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mugen

2017/10/12 04:46

回答ありがとうございます。 exec('nohup [php] の部分を exec('nohup [phpのフルパス] に変更するということですよね? 変更してみましたが変化はありませんでした。
guest

0

CGI・PHP・SSI | WebARENA | SuiteXサポート

WebARENAのページを見ると、モードによって動作できるフォルダが違うようですが、このあたりは意識できてますでしょうか?

投稿2017/10/06 08:10

n884

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mugen

2017/10/09 09:07

回答ありがとうございます。 アップロードした時は常にアスキーモードだったので問題ないと思います。 CGIの項目ですがphpも対象なのでしょうか?
n884

2017/10/10 00:16

今回はexecで起動させているのでCGIでの動作になるんでは? cgiフォルダに設置してexecで動くんであればそういうことだと思います。
mugen

2017/10/10 04:26

なるほど!勉強になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問