0

我有一个脚本,我试图在命令行中使用我的 Web 服务器上的命令执行:

php /path_to_file/file.php 'alert' >> /path_to_log_directory/exec.log &

显然,这两条路径都指向日志和 php 文件的位置。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,但网络服务器运行的是 nginx 和旧版本的 PHP。谁能帮助弄清楚为什么这个文件在我的本地设置上执行得很好,但在我的网络服务器上却没有?

这是一个精简版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 文件在 shell 中执行时,init.php 的代码几乎作为 shell 中的文本返回,而不是作为 PHP 脚本处理。有任何想法吗?

4

3 回答 3

1

我还遇到这样的问题,当 PHP 文件在 shell 中执行时,init.php 的代码几乎作为 shell 中的文本返回,而不是作为 PHP 脚本处理。

这听起来像您没有启用短标签。

通过 CLI 运行时,PHP 可以使用与在 Apache 下不同的 php.ini。运行php -i以确定它正在使用的配置文件,然后编辑适当的配置文件以启用短标签。

于 2013-08-02T12:34:38.253 回答
0

用这个

 mysql_query()

代替

 mysql_subquery()
  • 您应该使用 PDO 或 mysqli 而不是 mysql。mysql 已经被弃用了
于 2013-08-02T11:33:58.010 回答
0

您已将 PHP 配置为隐藏通知或所有错误消息,具体取决于名为DEBUG. 请比较:

<?php

error_reporting(E_ALL ^ E_NOTICE);
$foo1++;


error_reporting(0);
$foo2++;


error_reporting(E_ALL);
$foo3++;

小提琴

解决这个问题,你就会知道发生了什么。

编辑

我还遇到一个问题,当 PHP 文件在 shell 中执行时,init.php 的代码几乎作为 shell 中的文本返回,而不是作为 PHP 脚本处理。有任何想法吗?

很可能,您没有启用short_open_tag。当然,这完全解释了致命错误:如果你定义函数的代码mysql_subquery()没有运行,就没有办法使用它:)

奇怪的是,您应该已经看到源代码从您的终端中倾泻而下。我猜输出缓冲正在掩盖它。

于 2013-08-02T12:02:10.870 回答