shell-コマンドラインPHPスクリプトが正しく実行されない
Webサーバーのコマンドを使用してコマンドラインで実行しようとしているスクリプトがあります:
php /path_to_file/file.php 'alert' >> /path_to_log_directory/exec.log &
明らかに、ログとphpファイルの場所を指す2つのパスがあります。 phpファイルには次のコードがあります:
<?php
set_time_limit(3600);
require_once(dirname(dirname(__FILE__)).'/apps/init.php');
include (dirname(dirname(__FILE__)) . '/apps/avl_counter.php');
AvlCounter::$showReports = false;
AvlCounter::updateWholeInventory(false);
?>
これで、updateWholeInventoryは、クラスにないinit.phpファイルから関数 "mysql_subquery"を呼び出します。これにより、呼び出される関数はグローバル関数になります。ただし、上記のコマンドラインPHPコマンドを実行しようとすると、ターミナルから次のように表示されます。
PHP Fatal error: Call to undefined function mysql_subquery() in /path_to_file/avl_counter.php on line 521
このファイルは、Apacheを実行しているMAMPである私のローカル環境では正常に機能しますが、Webサーバーはnginxと古いバージョンのPHPを実行しています。このファイルがローカルセットアップでは正常に実行されるのに、Webサーバーでは正常に実行されない理由を誰かが理解するのを手伝ってもらえますか?
これがinit.php
の縮小版です:
<?
date_default_timezone_set('America/Chicago');
require(dirname(__FILE__) . '/config.php');
if (DEBUG) {
ini_set('display_errors', true);
error_reporting(E_ALL ^ E_NOTICE);
} else {
error_reporting(0);
}
ob_start();
...
function mysql_subquery( $file=false,$line=false,$query=false) {
global $queryLog;
if (empty($queryLog))
$queryLog = array();
$start = microtime(true);
// ...
}
更新
PHPファイルをシェルで実行すると、init.phpのコードがPHPスクリプトとして処理されるのではなく、シェル内のテキストとしてほぼ返されるという問題も発生します。何かアイデアはありますか?
答え :
解決策:
PHPファイルをシェルで実行すると、init.phpのコードがPHPスクリプトとして処理されるのではなく、シェル内のテキストとしてほぼ返されるという問題も発生します。
これは、短いタグが有効になっていないようです。
CLIを使用して実行する場合、PHPはApacheで使用する場合とは異なるphp.iniを使用できます。
php -i
を実行して使用している構成ファイルを特定し、適切な構成ファイルを編集して短いタグを有効にします。
答え :
解決策:
これを使用
mysql_query()
の代わりに
mysql_subquery()
- mysqlの代わりにPDOまたはmysqliを使用する必要があります。 mysqlはすでに非推奨です
答え :
解決策:
DEBUG
という定数に応じて、通知またはすべてのエラーメッセージを非表示にするようにPHPを構成しました。比較してください:
<?php
error_reporting(E_ALL ^ E_NOTICE);
$foo1++;
error_reporting(0);
$foo2++;
error_reporting(E_ALL);
$foo3++;
これを修正すると、何が起こっているのかについての手がかりが得られます。
編集
また、PHPファイルがで実行されたときに問題が発生します シェルでは、init.phpのコードはほとんどテキストとして返されます PHPスクリプトとして処理されるのではなく、シェル。何かアイデアはありますか?
ほとんどの場合、short_open_tagを有効にしていません。もちろん、これは致命的なエラーを完全に説明しています。関数
mysql_subquery()
を定義するコードが実行されない場合、それを使用する方法はありません:)奇妙なことに、ソースコードが端末に流れ落ちるのを見る必要がありました。出力バッファリングがそれを覆い隠していたと思います。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。