fgetcsv 的问题导致 CLI 中的循环但不是 apache2

Issue with fgetcsv causing loop in CLI but not apache2

我对以下正确打开 csv 文件 (list.csv) 并检测其中一行是否与变量 $match 中的内容相匹配的代码有点困惑。只是为了澄清,脚本工作正常。当我通过浏览器调用脚本时,没有显示任何错误(我启用了它们),但是当我在 CLI 中 运行 它进入循环并出现以下错误时:

Warning: in_array() expects parameter 2 to be array, null given in /var/www/html/script.php on line 169
Exclusion not found<br>
Warning: fgetcsv() expects parameter 1 to be resource, boolean given in /var/www/html/script.php on line 165

并不断重复...

第 169 行是 if( in_array( $match ,$line ) )

第 165 行是 while (($line = fgetcsv($file)) !== FALSE) {

if ($check_list == "1") {
    $file = fopen('list.csv', 'r');
    while (($line = fgetcsv($file)) !== FALSE) {
    print_r($line);

    if( in_array( $match ,$line ) )
        {
        echo "match found";
        $name = $line[0];
        $address = $line[1];
        $phone = $line[2];
        echo "name : " . $name;
        echo "address : " . $address;
        echo "phone : " . $phone;
        }
    else {
        echo "Not found in file.";
        }

}
fclose($file);
}

我有点不明白为什么它通过 CLI 以这种方式运行,而不是通过浏览器(我可以看到)。

提前致谢。

与 cli 相比,当您通过 Web 浏览器 运行 脚本时,环境有很多差异。

当您在脚本中使用相对路径并通过 cli 运行 脚本时,php 将认为您正在搜索的文件是相对于当前工作目录的。例如,如果您当前的工作目录是

/home/ 

并且您的脚本和文件位于脚本目录中

/var/www/html/script.php
/var/www/html/list.csv

当你运行

php -f /var/www/html/script.php

php -f ..var/www/html/script.php

PHP 将搜索相对于您的工作目录的文件

/home/list.csv

不存在。当我尝试从 crontab 执行 运行 PHP 脚本时,我第一次遇到这样的问题,导致所有相对路径中断。因此,要么将工作目录更改为 /var/www/html/,要么只使用绝对路径,在你的情况下

$file = fopen('/var/www/html/list.csv', 'r');