yangakw yangakw

php执行脚本阻塞http请求

in 记录read (70) 文章转载请注明来源!

问题出现的介绍

我写了一个php控制bat运行的接口,在前端请求一次后整个服务器就停了。

简单分析

这个问题主要是因为php是单进程处理一个http请求.再加上我用的是php自带的web服务,所以其他设备也打不开服务器。

进一步分析

我的理解是用户开始http请求后,php的进程就开始处理这个请求,如果php进程被什么阻塞了就没办法产生http响应,既然是php[exec]函数的问题,我决定换个执行脚本的函数system,passru。发现都不行。我看了下文档

system() 输出并返回最后一行shell结果。 
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。 
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。 

他们都要等脚本结束才能结束,我试了下限制php的执行时间,set_time_limit。这样就会出现程序手动停止后才报php执行超时。
所以设置php超时是不能解决这个问题。

定性

最后我觉得如果可以异步调用就没问题了,linux下使用nohup可以单独开一个进程执行脚本。windows下貌似没有合适的工具。
没办法我只能各种尝试,最后发现调用vbs可以不阻塞php的服务。
我的测试代码
run.vbs

Set oArgs = WScript.Arguments 
Set a=WScript.CreateObject("WScript.Shell")   
a.run "1.bat "+oArgs(0)

index.php

<?php
exec("run.vbs 123"); 
echo 111;
?>

1.bat

@echo off
for %%i in (%0) do set aa=%%~dpi 
cd %aa%
for %%i in (%1) do set aa=%%~dpi  
cd %aa%   

taskkill /f /im flashShell.exe
taskkill /f /im effect.exe 
start   %~n1

执行php -S localhost:88

在浏览器访问index.php触发脚本就不会有阻塞的问题

jrotty WeChat Pay

微信打赏

jrotty Alipay

支付宝打赏

文章二维码

扫描二维码,在手机上阅读!

发表新评论
博客已运行
© 2017 yangakw
PREVIOUS NEXT
雷姆
拉姆