php - 如何在 php 中运行 shell_exec(),除非被杀死或停止,否则不会停止?
问题描述
我正在为离线模式构建一个 Laravel 应用程序(仅适用于 Windows 操作系统)。有客户端和服务器设置。
在服务器仪表板中,有一个按钮可以“打开”服务器以允许客户端连接到服务器。参考(如何从另一台电脑访问我的 laravel 应用程序?)
我的代码不起作用。
// Route
Route::post('server-on', 'ServerController@powerOn')->name('server-on');
// ServerController
public function powerOn(){
$ip = getHostByName(getHostName()); // IPv4 Address (192.168.254.120)
$command = 'php artisan serve --host ' . $ip . ' --port 1807 2>&1 &';
shell_exec($command);
}
我有这个的原因是假设最终用户不是技术人员。我不希望他们打开 cmd 并输入命令(这可能是我最后的手段)。
解决方案
shell_exec()
与它无关。如果您的应用程序在 Linux 上运行,那么要让执行的程序在调用调用立即返回时继续在后台运行,您必须使用帮助程序,例如nohup(并删除尾随&
):
$command = "nohup php artisan serve --host {$ip} --port 1807 2>&1";
...
编辑
我正在使用 Windows。
$command
如果是这样,首先,由于您尝试重定向 i/o 流的方式(以及使用) ,您的前者在 Windows 平台上无效&
。尽管如此,要在 Windows 后台运行东西,您还需要一个帮助程序,例如START
(此处的文档)。
请参阅有关超级用户的相关问题:如何在后台执行 Windows 命令行?.
推荐阅读
- php - 文件名在 Web 服务器上的解释与在 Localhost 上的解释不同
- amazon-web-services - AWS ALB 使用 TLS 转发到 Lambda
- python-3.x - 如何将 dateTime 字符串转换为 dateTime
- python - 用bs4刮台
- docker - 如何在shell脚本中将命令的输出传递给另一个
- adobe - Adobe AEM Querybuilder 调试器 - 多路径和多节点名
- excel - 识别连续值的 Excel 函数
- r - 创建一个添加 N 行采样函数的 data.frame
- python - 如何将 matplotlib.pyplot.contour 转换为 RGBA 列表或数组?
- qemu - QEMU 可以捕获对 Cortex-M 处理器上不存在的 RAM 的访问吗?