PHP CLI -B选项执行后主脚本未运行且进程阻塞问题排查
问题:PHP CLI使用-B选项后主脚本阻塞不执行
在Linux Shell中执行PHP解释器时,使用-B选项指定初始化代码后,初始化代码已执行,但进程陷入阻塞,主脚本f2.php并未运行。问题复现步骤如下:
$ php -v PHP 8.1.13 (cli) (built: Nov 22 2022 14:42:07) (NTS gcc x86_64) Copyright (c) The PHP Group Zend Engine v4.1.13, Copyright (c) Zend Technologies with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies $ cat f2.php <?php echo "f2 running.\n"; ?> $ php f2.php f2 running. $ php -B 'echo "init ";' f2.php init
执行后Shell陷入阻塞,需按下ctrl+C才能回到提示符,原本预期f2.php会被正常执行。
原因与解决方法
问题出在**-B选项传递的代码中包含了实际换行符**:
在Shell单引号包裹的代码里,echo "init ";中的换行是直接输入的实际换行,这会导致PHP CLI认为你输入的初始化代码不完整,进入交互模式等待补全代码,因此进程阻塞,不会继续执行后续的f2.php。
解决方法很简单,把代码中的实际换行替换为转义换行符\n,或者将代码写在一行:
- 使用转义换行符:
php -B 'echo "init\n";' f2.php
- 将代码写在一行:
php -B 'echo "init";' f2.php
执行上述修改后的命令,初始化代码执行后,f2.php会正常运行,不会再出现阻塞。
内容的提问来源于stack exchange,提问作者jonasmike
相关产品推荐
相关产品推荐

