У меня есть цель в Ant
<target name="test">
<exec executable="php" failonerror="true">
<arg value="-S"/>
<arg value="localhost:80"/>
<arg value="-t"/>
<arg value="web"/>
</exec>
<exec executable="phpunit" failonerror="true">
<arg value="tests"/>
</exec>
</target>
Проблема в том, что когда я запускаю это, цель блокируется из-за встроенного сервера PHP. Как запустить сервер PHP, а затем запустить модуль PHP, а затем остановить сервер, когда модуль PHP завершит работу (либо успешно, либо с ошибкой)?
Если вы хотите, чтобы Ant породил php
процесс, вы можете установить spawn="true"
в вызове задачи:
<exec executable="php" failonerror="true" spawn="true">
<arg value="-S"/>
<arg value="localhost:80"/>
<arg value="-t"/>
<arg value="web"/>
</exec>
Примечание об его использовании из документации, хотя:
Если вы создаете команду, ее вывод не будет зарегистрирован в ant.
Параметры свойств input, output, error и result не активны при порождении процесса.
Я наконец получил какое-то рабочее решение. Чтобы получить PID сервера PHP, мне нужно выполнить ps
команду, а затем сделать регулярное выражение, чтобы получить PID, а затем убить сервер.
<project name="myapp" default="test" basedir=".">
<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="ant-contrib.jar" />
<target name="start-server">
<echo>Starting PHP server</echo>
<exec executable="php" spawn="true">
<arg value="-S"/>
<arg value="localhost:8080"/>
<arg value="-t"/>
<arg value="${basedir}"/>
</exec>
<sleep seconds="1"/>
</target>
<target name="stop-server">
<!-- Getting the PHP server PID -->
<exec executable="ps">
<arg value="ax"/>
<redirector outputproperty="php.ps">
<outputfilterchain>
<linecontains>
<contains value="php"/>
<contains value="localhost:8080"/>
</linecontains>
</outputfilterchain>
</redirector>
</exec>
<propertyregex property="php.pid" input="${php.ps}" regexp="^\s+(\d+)" select="\1"/>
<echo>Killing PHP server at ${php.pid}</echo>
<exec executable="kill">
<arg value="${php.pid}"/>
</exec>
</target>
<target name="test">
<antcall target="start-server"></antcall>
<echo>Starting test</echo>
<sleep seconds="3"/>
<echo>Finishing test</echo>
<antcall target="stop-server"></antcall>
</target>
</project>