PHP脚本添加多个命令行选项后出现参数错误的问题求助
我之前处理邮件管道脚本的时候遇到过类似的坑!从你的错误提示里能看到,系统给出的是php-cgi的用法说明,这说明实际执行脚本的可能不是PHP的CLI(命令行)版本,而是CGI版本——这俩的参数规则不一样,-q选项在CGI模式下的解析逻辑和CLI完全不同,所以才会报“选项找不到”的错误。
给你几个可行的解决方向:
先确认PHP路径指向的版本
登录服务器执行/usr/bin/php -v,看看输出里有没有「Command Line Interface」的字样。如果显示的是CGI版本,那你得把shebang改成指向CLI版本的路径,比如:#!/usr/bin/php-cli -q -d register_argc_argv=1不同服务器的PHP CLI路径可能不一样,比如有的是
/usr/local/bin/php-cli,你可以用which php-cli命令找准确路径。用Shell脚本包装来规避Shebang参数解析问题
有些系统的Shebang对多参数的支持很糟糕,会把所有参数当成一个整体传给解释器,导致解析错误。这种情况下,你可以把脚本改成Shell包装的形式,让Shell帮你正确拆分参数:#!/bin/sh exec /usr/bin/php -q -d register_argc_argv=1 "$0" "$@"把原来的PHP Shebang换成上面这两行,这样Shell会先启动,然后调用带正确参数的PHP命令,还能完整传递脚本收到的所有参数,邮件管道场景下用这个方法几乎不会出问题。
尝试调整参数顺序
也可以先简单试试把参数顺序调换一下,把-d参数放在前面:#!/usr/bin/php -d register_argc_argv=1 -q部分环境下参数顺序会影响解析结果,说不定换个顺序就正常了。
你可以按这个顺序试一下,先调顺序,不行就确认PHP版本,最后用Shell包装,应该能解决你的问题。
备注:内容来源于stack exchange,提问作者bilogic

