如何从 PHP 脚本中同步生成另一个 PHP 脚本?
How to synchronously spawn another PHP script from within a PHP script?
我有一个目前用Bash编写的终端应用程序,大约20,000 SLOC。我喜欢它的设置方式的一件事是它非常模块化。不同的组件分布在不同的文件中,可以在 运行 时间执行。这意味着系统的某些部分可以在 运行 时间内进行“热交换”或更新,而无需终止主程序并重新执行它。
缺点是有很多数据库 I/O,这使得它变得非常笨拙,因为 Bash 真的不适合这个。目前,它与生成 PHP.
的 HTTP API 接口
我想在 PHP (CLI) 中原生重写它以去掉中间层,这样应用程序可以直接与数据库通信,使维护更容易。我一直在思考的一个问题是如何使用 Bash 复制相同的模块化。使用 Bash,如果我调用脚本 A,并对脚本 B 进行更改,然后我从脚本 A 输入脚本 B(假设它在某处的条件块中,而不是在文件顶部),无需重新执行脚本 A 即可获取更改,因为脚本 B 在执行之前不会被解释。
我正在努力弄清楚如何使用 PHP 实现这一点。例如,这 不会 起作用:
include('script.php');
原因是include都是在解释脚本的时候执行的,而不是在运行的时候执行的。
A similar question has been asked already,但它并没有具体解决这方面的问题,只是一般如何启动另一个脚本。我希望基本上能够在 运行 时间重新生成脚本,当应用程序决定它应该被执行时。 shell_exec
和 passthru
似乎是 PHP 中内置的所有相似内容,但我不确定这是正确的,因为那只是产生另一个系统 shell 和在那里做,所以它不像 Bash.
那样“直接”
在Bash中PHP的正确是什么:
if [ "$x" = "3" ]
then
./launchscriptnow.sh
fi
用户现在应该正在执行 launchscriptnow.sh
。请记住,这是一个交互式应用程序,因此它不仅仅是做某事并返回一个值。用户可以在这里停留 2 秒、5 分钟或一个小时。
因此 ./launchscriptnow.sh 仅在 代码到达该行时 被解释, 而不是 当父脚本本身被解释?这种东西是纯粹的 shell 构造还是有等效的东西?
反对所有建议,您可以:
$script = file_get_contents('module_b.php');
$script = str_replace('<' . '?php', '', $script);
$script = str_replace('?' . '>', '', $script);
eval($script);
我不明白您对“解释脚本时”与“执行脚本时”的担忧?我有许多脚本使用变量名来包含脚本,并在执行 include 语句之前做出正确的决定。 $result = include($script_name)
可以正常工作,可以在 运行 时决定包含哪个脚本。
您描述问题的方式似乎并不表示您想“启动”另一个进程,但我可能错了。
我有一个目前用Bash编写的终端应用程序,大约20,000 SLOC。我喜欢它的设置方式的一件事是它非常模块化。不同的组件分布在不同的文件中,可以在 运行 时间执行。这意味着系统的某些部分可以在 运行 时间内进行“热交换”或更新,而无需终止主程序并重新执行它。
缺点是有很多数据库 I/O,这使得它变得非常笨拙,因为 Bash 真的不适合这个。目前,它与生成 PHP.
的 HTTP API 接口我想在 PHP (CLI) 中原生重写它以去掉中间层,这样应用程序可以直接与数据库通信,使维护更容易。我一直在思考的一个问题是如何使用 Bash 复制相同的模块化。使用 Bash,如果我调用脚本 A,并对脚本 B 进行更改,然后我从脚本 A 输入脚本 B(假设它在某处的条件块中,而不是在文件顶部),无需重新执行脚本 A 即可获取更改,因为脚本 B 在执行之前不会被解释。
我正在努力弄清楚如何使用 PHP 实现这一点。例如,这 不会 起作用:
include('script.php');
原因是include都是在解释脚本的时候执行的,而不是在运行的时候执行的。
A similar question has been asked already,但它并没有具体解决这方面的问题,只是一般如何启动另一个脚本。我希望基本上能够在 运行 时间重新生成脚本,当应用程序决定它应该被执行时。 shell_exec
和 passthru
似乎是 PHP 中内置的所有相似内容,但我不确定这是正确的,因为那只是产生另一个系统 shell 和在那里做,所以它不像 Bash.
在Bash中PHP的正确是什么:
if [ "$x" = "3" ]
then
./launchscriptnow.sh
fi
用户现在应该正在执行 launchscriptnow.sh
。请记住,这是一个交互式应用程序,因此它不仅仅是做某事并返回一个值。用户可以在这里停留 2 秒、5 分钟或一个小时。
因此 ./launchscriptnow.sh 仅在 代码到达该行时 被解释, 而不是 当父脚本本身被解释?这种东西是纯粹的 shell 构造还是有等效的东西?
反对所有建议,您可以:
$script = file_get_contents('module_b.php');
$script = str_replace('<' . '?php', '', $script);
$script = str_replace('?' . '>', '', $script);
eval($script);
我不明白您对“解释脚本时”与“执行脚本时”的担忧?我有许多脚本使用变量名来包含脚本,并在执行 include 语句之前做出正确的决定。 $result = include($script_name)
可以正常工作,可以在 运行 时决定包含哪个脚本。
您描述问题的方式似乎并不表示您想“启动”另一个进程,但我可能错了。