在Windows CLI循环中运行php.exe,非常慢

时间:2018-01-05 08:45:31

标签: php windows batch-file cmd

我有一个需要每6秒运行一次的php脚本。由于Windows任务计划程序仅允许1分钟的间隔。所以我编写了一个task.bat文件来启动一个循环,每6秒启动一次subask.bat(启动PHP脚本)。任务计划程序每2分钟启动一次task.bat。

所以启动顺序是这样的:

  1. 任务计划程序每2分钟启动一次task.bat
  2. task.bat启动一个循环,在每次迭代中,它启动subtask.bat,然后等待6秒,重复20次
  3. subtask.bat启动带参数的PHP脚本
  4. 调度工作正常,但有一个问题:当task.bat调用subtask.bat需要很长时间才能完成。例如,如果我单独运行subtask.bat,则需要2秒才能完成。但是当task.bat调用它时,将需要将近30秒才能完成。

    我需要解决这个问题,但不知道在哪里看。

    这是我的task.bat文件:

    for /l %%y in (1,1,2) do (
        @echo TaskStart at 1min interval
    
        for /l %%x in (1, 1, 9) do (
            @echo Subtask (%%y : %%x)
            @start "" /MIN "subtask.bat"
            @ping 127.0.0.1 -n 6 > nul
        )
    )
    
    exit 0
    

    这是subtask.bat

    %PHP_PATH%\php.exe -c %PHP_INI_PATH%\php.ini  ../public/index.php --method="POST" --uri="/cron/sync" --header="Content-Type:application/json" --body="{\"offset\":\"0\",\"count\":\"1\",\"type\":\"TYPE1\"}"
    exit 0
    

    PHP脚本是用Slim框架编写的,所以sub_task.bat实际上模拟了一个带有一些参数的端点的POST请求。 PHP脚本基本上执行以下操作:

    1. 从MySQL获取一条记录,
    2. 对其他服务进行卷曲调用
    3. 根据2的结果,它可能会也可能不会更新MySQL记录
    4. 更新: 我们需要在新线程或新进程中运行每个子任务,以便每个迭代都不会被任何单个子任务阻塞。

1 个答案:

答案 0 :(得分:0)

您可以在一个批处理文件中执行所有操作,这意味着您在task.bat中包含子任务并在那里调用它。

for /l %%y in (1,1,2) do (
    @echo TaskStart at 1min interval

    for /l %%x in (1, 1, 9) do (
        @echo Subtask (%%y : %%x)
        @call :subtask
        @ping 127.0.0.1 -n 6 > nul
    )
)

exit 0

:subtask
%PHP_PATH%\php.exe -c %PHP_INI_PATH%\php.ini  ../public/index.php --method="POST" --uri="/cron/sync" --header="Content-Type:application/json" --body="{\"offset\":\"0\",\"count\":\"1\",\"type\":\"TYPE1\"}"
GOTO :eof

我没有对它进行过测试,但它应该有效。