【问题标题】:Running PHP script in background using Ant使用 Ant 在后台运行 PHP 脚本
【发布时间】:2012-08-20 16:11:41
【问题描述】:

在我现在的雇主,我们使用 Ant 来执行我们的构建脚本,我需要在我们的 build.xml 文件中添加一个目标,该目标将在后台启动 4 个作为 Gearman 工作者的 PHP 脚本,然后停止这些脚本一次构建完成。

我查看了“parallel”和“daemons”指令(这是正确的词吗?)但我对 Ant 的经验不足,无法追踪我缺少的关于如何确保脚本运行的信息在后台。

【问题讨论】:

  • 所以您说您需要在构建过程结束时停止 PHP 脚本,而不是仅仅将它们启动到后台并让它们运行?您是否需要捕获这些脚本的输出?
  • 我不需要捕获这些脚本的输出,但是一旦构建结束就需要停止它们。它用于使用 Gearman 并行运行 Behat 测试,并且我在运行它将运行的服务器上没有任何访问权限来启动它们,让它们继续运行,并在它们崩溃时重新启动(无论出于何种原因)。
  • 一次可以有多个构建吗? gearman 服务器及其作业将如何处理?
  • 当然,一次运行的可能不止构建。 Gearman 应该能够处理它 AFAICT
  • 我发现运行多个构建会导致不确定的构建获得任何特定的工作。因此构建 A 将处理构建 B 的作业,从而导致误报/误报。我最终抽象出与 Beanstalk 的实际集成,因此我将能够创建一个“内联”执行程序,以避免处理每次构建的作业命名空间。 注意:我们实际上使用的是 Beanstalk。

标签: php ant gearman


【解决方案1】:

由于您没有得到很多答案,我会建议一种可能让您入门的低技术方法...

使用 ant exec 任务触发 4 个后台 php 进程,将它们的 pid 写入一个文件,该文件包含内部版本号(可能来自环境)以识别它。

一旦构建完成,使用停止参数再次运行脚本,并使用文件命名系统来查找进程 id、kill take 和删除 piddling 文件。可能也值得您在那里使用某种陈旧的工作清洁剂。

在找到更优雅的解决方案之前,不应该太难敲出有效的东西。

编辑:

这对你有什么好处:

test.php:(这将是您的工作脚本)

<?php while (true) { echo "Hello world" . PHP_EOL; sleep(5); }

runner.sh:

#!/usr/bin/bash

FILE_TO_RUN=test.php

if [ -z $TEST_RUNNERS ]; then
  TEST_RUNNERS=4;
fi;

if [ -z $BUILD_NUMBER ]; then
  echo "Can not run without a build number";
  exit 1;
fi;

FILE="${BUILD_NUMBER}.run"

if [ -e $FILE ]; then
    while read line;
    do
        echo "Killing process " $line
        kill -9 $line
    done
    echo "Deleting PID file"
    rm -f $FILE
    exit 0
fi  < $FILE

for ((i=1; i<=$TEST_RUNNERS; i++)); do
  echo "Setting up test runner number " $i " of " $TEST_RUNNERS;
  php $FILE_TO_RUN &
  echo "PID number: " $!
  echo $! >> "${BUILD_NUMBER}.run"
done
exit 0

【讨论】:

  • 嗨劳埃德,感谢您的建议。这里的一个潜在问题是我不能真正改变工作脚本。我正在使用 Behat(PHP 的 BDD 工具),他们有一个扩展,允许您作为 Gearman 工作人员运行它。我知道,不是很透明,但在不对脚本本身进行大量修改的情况下,我能做的事情非常有限
  • 在手机上写的,所以你不得不原谅它自动更正我,懒得回读
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多