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');
我对以下正确打开 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');