XAMPP环境中passthru调用exe程序的问题排查及相关疑问
Hey,我来帮你一步步梳理这个问题,解决当前调用失效的问题,同时解答你关于fork的疑问:
一、关于能否在XAMPP中fork exe的问题
首先得明确:Windows环境下的PHP不支持pcntl_fork()这类进程控制函数,而XAMPP在Windows上默认用的是Windows版本的PHP,所以没法直接用fork来创建子进程。不过如果想让exe后台运行、不阻塞PHP脚本,可以用Windows自带的start命令模拟类似效果,比如:
passthru('start /B ./Uc/UcCmd.exe 2.uni');
这里的/B参数表示不弹出新的命令提示符窗口,让exe在后台执行。但这种方式没法直接捕获exe的输出,需要exe自己把输出写到日志文件里才行。
二、当前passthru调用无报错但程序不工作的排查步骤
咱们从最基础的点开始排查:
先确认文件路径是否正确
PHP脚本的执行路径不一定是你以为的脚本所在目录,你可以在脚本里加一行echo getcwd();,运行后看看当前工作目录是什么,再核对./Uc/UcCmd.exe的相对路径是否指向正确的文件。如果路径错了,exe根本没被调用到。手动测试exe是否能正常运行
打开命令提示符,cd到PHP脚本的工作目录(就是上面getcwd()输出的路径),然后运行./Uc/UcCmd.exe 2.uni,看看手动执行能不能正常工作:- 如果手动执行也不行:那问题出在
UcCmd.exe本身或者2.uni文件上,比如文件损坏、参数错误,得先解决exe本身的问题。 - 如果手动执行正常:那问题就出在PHP调用的环境上,继续往下排查。
- 如果手动执行也不行:那问题出在
捕获完整的错误信息
你当前的代码只捕获了标准输出,但exe的错误信息可能在标准错误流里没被捕获到。修改命令把错误流重定向到标准输出,这样就能看到所有信息了:passthru("./Uc/UcCmd.exe 2.uni 2>&1");这样
$var里就会包含所有输出和错误,能帮你找到隐藏的问题,比如依赖缺失、权限不足之类的提示。检查权限设置
XAMPP的Apache服务通常是以System用户或者某个受限用户身份运行的,你需要确保这个用户对UcCmd.exe、2.uni文件以及所在目录有读取、执行权限。右键文件→属性→安全选项卡,检查对应的用户组是否有足够权限。检查PHP的安全配置
打开php.ini文件,检查这两个设置:disable_functions:看看列表里有没有passthru,如果有就把它删掉,重启Apache。open_basedir:如果这个选项设置了目录限制,要确保Uc所在的目录在允许的范围内,否则PHP会被禁止访问该目录下的文件。
排查环境变量依赖
有些exe需要依赖特定的系统环境变量(比如某些DLL文件的路径),而Apache运行的环境和你手动登录Windows的环境不一样。你可以试试把exe依赖的所有DLL文件复制到UcCmd.exe的同目录下,或者在调用前先设置必要的环境变量。
备注:内容来源于stack exchange,提问作者profittech

