我以前使用 Windows,使用 nginx 和 PHP。我自己使用一个仅限本地主机的 Web 服务器。在我的 Web“控制面板”中,我拥有各种非常省时的快捷方式。例如,我可以在同一台计算机上单击各种已记录的错误以调出 Notepad++,打开正确的文件并转到正确的行和列。
为此,我只需shell_exec('notepad++.exe blablabla 1 2 3');
根据请求从提供页面的 PHP 文件运行(伪命令)。
现在我改为运行 Linux(再次使用 nginx 和 PHP),我突然无法执行此操作。无论我做什么,都没有程序打开,也没有记录任何有关此操作的信息。没有错误。什么都没有。它只是被忽略了。我已经尝试了所有方法,包括:
shell_exec('kate blablabla 1 2 3 &');
shell_exec('mousepad blablabla &');
shell_exec('vivaldi &');
shell_exec('kate blablabla 1 2 3 >/dev/null &');
shell_exec('mousepad blablabla >/dev/null &');
shell_exec('vivaldi >/dev/null &');
什么都没发生。我以为会看到某种权限错误之类的,但什么都没有发生。
重要的:以上所有命令工作从 PHP CLI 运行时。我在这里谈论的是从浏览器(在本地主机上)请求并提供给浏览器的 PHP 生成的网页。
我考虑过在“sudoers”文件中为 创建一个条目www-data
,但我不想向用户 授予 root 访问www-data
权限。此外,这些命令不需要 root 权限,我看不出有什么理由www-data
不能像我的普通桌面用户一样启动这些程序。
我实际上想出了一个疯狂的解决方法,其中我基本上有一个数据库表,而不是直接调用 PHP 中的函数,而是发送函数调用及其参数并将它们存储为 JSON 对象,然后我有一个 CLI PHP 守护程序不断查找该表中的记录,获取它们的数据并从其工作的 CLI 上下文中执行函数调用,然后删除该记录。 (因此,该表通常在任何给定时间都不会超过 1-2 个条目,这意味着作为数据库表,它应该非常“轻便”。)
这种解决方法的缺点是,除了需要做很多额外的工作并且看起来有点丑陋/愚蠢之外,实际执行操作(函数调用)可能需要几秒钟,具体取决于我的 CLI 守护程序需要处理多少其他事情。我想我可以创建一个单独的守护程序,它只循环并执行此类函数调用,但即使我这样做,完全依赖数据库并浪费资源寻找新记录也感觉很糟糕。让我感到烦恼的是,我不能像以前一样避免所有这些无用的东西并运行外部程序。
也许我只是“运气好”,发现这可以在 Windows 上顺利完成,不应该指望可以直接完成?不过,我不明白为什么不能。
我已经完成了所有解决方法,因此保留它很容易,但我仍然想听听您是否能想到更合理的方法。如果您的解决方案是以其他用户身份运行 nginx,则出于某些原因这是不可能的。另外,这是 Debian 12,我使用 PHP-FPM。