exec php が実行できない問題の解決策: 1. yii ファイルの最初の行を変更して、php インタープリターを直接指定します; 2. exec 呼び出しメソッドを変更して、php インタープリターを直接指定します。

#この記事の動作環境: Windows 7 システム、PHP バージョン 7.1、Dell G3 コンピューター。
php exec が実行できないのはなぜですか?
Origin
スケジュールされたタスクがあります。OSS バックグラウンド管理ページでクリックして開始したいのですが、いくつかの方法を試しましたが、システムやシステムに関係なく、うまくいきません。 exec (シェルコマンドラインで手動で実行しても問題ありません) ); 最初は、Web サーバーの nginx ユーザーの権限の問題を疑いましたが、後で環境変数が php 実行可能ファイルを見つけることができないことがわかりました (nginx ユーザーが原因で、は制限付きユーザーです);
問題箇所
1 2 | exec ( "/home/app/example/api/app/yii demand/virtual {$id}" , $output );
print_r( $output );
|
ログイン後にコピー
以上 スクリプト実行後はArray()
のみが出力されます当然業務コードは実行されません(ビジネスコードの1行目が出力されます);
1 2 3 | exec ( "/home/app/example/api/app/yii demand/virtual {$id} 2>&1" , $output );
print_r( $output );
|
ログイン後にコピー
上記のスクリプトを実行するとエラーが出力されます: Array ([0] => /usr/bin/env: php : そのようなファイルまたはディレクトリはありません )
;
/usr/bin/env: php
この文は yii ファイル #!/usr の最初の行から来ています/bin/env php
、これは yii ファイルを実行する php スクリプト インタプリタの場所を示すことを目的としていますが、エラー出力は /usr/bin /env: php: No such file or directory## です。 # php が見つからないことを意味します;
[推奨学習: "
PHP ビデオ チュートリアル "]
解決策
解決策 1 : yii ファイルの最初の行を変更して、php インタープリターを直接指定します。- は
#!/usr/bin/env php から
# !/usr/local/bin/ に変更されます。 php、つまり、php インタープリターの場所を直接指定します (コードがリリースされたときに変更することもできます);
オプション 2: exec 呼び出しメソッドを変更し、php インタープリターを直接指定します。 -
1 2 | exec ( "/usr/local/bin/php /home/app/example/api/app/yii demand/virtual {$id} 2>&1" , $output );
print_r( $output );
|
ログイン後にコピー
注: 実際の実行では、exec コマンドにはまだ問題がいくつかあります。以下の「504 エラー」を参照してください。-
504 エラー
実行時間が長すぎる場合 (60 秒以上など)、ページに 504 エラー (ゲートウェイ タイムアウト) が表示されます; - 標準出力と標準エラーをリダイレクトする必要があります, するとバックグラウンドプロセスがコマンドを実行し、処理プロセス番号がページに出力されます;
-
1 2 3 4 | $cmd = '/usr/local/bin/php /home/app/example/yapp/yii demand/finish 2057' ;
$pid_file = 'msgrepeat.pid' ;
$exec_cmd = sprintf( "%s > /dev/null 2>&1 & echo $! > %s & cat %s" , $cmd , $pid_file , $pid_file );
exec ( $exec_cmd );
|
ログイン後にコピー
/usr/bin/envについて(移植性が高い?)
シバンとして「#!/path/to/NAME」ではなく「#!/usr/bin/env NAME」を使用する方が良いのはなぜですか?- /usr/bin/ はどのように機能しますか? env どのプログラムを使用すればよいか知っていますか?
-
nginx user
セキュリティ上の理由から、nginx ユーザーのシェルは通常 /sbin/nologin
関係は何ですか?スケジュールされたタスクと Web 操作の間で?
OSS バックグラウンド管理ページのスケジュールされたタスクとクリック操作の関係がうまく処理されていない;
yii フレームワークのコンソールと Web の 2 つの処理方法;- crontab のテスト容易性を向上させる方法の問題;
crontab のユーザー エクスペリエンスを向上させる方法の問題;
crontab タスクと API (コントローラー/アクション) コードを合理的に再利用する方法の問題;
# #フォアグラウンドとバックエンド コントローラー/アクションを共有する方法; または、複数のプロジェクト間でコード ライブラリを便利に共有する問題;
啓発
php-fpm はexec、system、shell_exec は機能しません。CLI のみ;
- PHP exec() はすべてのコマンドを実行しません;
-
以上がexec php が実行できない場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。