我在一个Apache服务器上通过Ratche运行ZMQ'push'接口,这个服务器在命令行上运行得非常好,并且按照我想要的方式与我的服务器交互。 这是代码
//script1.php <?php echo exec('php script2.php'); ?> //script2.php <?php $entryData = array( 'category' => 'modelLmdap' , 'job_id' => '1234' , 'text' => '' , 'status' => '' ); $context = new ZMQContext(); $socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher'); $socket->connect("tcp://localhost:5555"); $socket->send(json_encode($entryData)); ?>
当我执行script1.php时,在服务器窗口中看到一个popup窗口,显示“请求已logging”。 但是,如果我试图通过浏览器运行它,我得到一个空白页面,并在服务器上没有输出。
我环顾了这可能是由于Apache无法在命令行运行,而解决scheme是将以下内容添加到我的sudoers(使用sudo visudo):
www-data ALL=NOPASSWD: ALL
依然没有! 一个空白页。 我把命令切换到exec(),我得到这个错误:
致命错误:第8行/ home / username / server / qap / v2 / tool / push.php中找不到类'ZMQContext'
有任何想法吗?
编辑:我有人问我为什么要做这一切,这是一个坚实的问题。
TL; DR我想不出一种方法来执行另一个PHP脚本作为服务 – curl不在本地工作,包括不削减它。
我正在执行一些复杂的统计计算,这些计算需要大量的资源,并花费太多的时间来产生任何输出,导致特殊的脚本执行问题,包括空白页无故(即使我已经扩展了最大的脚本执行时间)和AJAX错误,尽pipe超时时间最长。 所以我将服务器端的计算分析到许多不同的后台进程,所有这些都是php脚本。 这也允许我在这个长脚本执行时更新用户。 有问题的调用是执行一个控制计算场的“控制器”脚本(是正确的术语?Idk)。 然后脚本与Push服务器(通过ZMQ)通信并将数据推送到客户端。 原来的代码是AJAX沉重,我真的不喜欢更新所有使用websockets,所以我已经解决了使用棘轮作为套接字服务器的“推”式的风格。 这意味着我可以使我原来的AJAX调用启动整个过程,然后页面从服务器单向接收更新。 这有很多好处,我最喜欢的是,通信本质上是单向的,这使得我不得不在服务器端实现大量的安全function。 不幸的是,为了这一切都工作,Ajax-ed脚本需要能够shell_exec“农场”脚本,因为他们需要作为后台进程运行,这就是我遇到我的问题。 我已经尝试了curl(),但是它只是捕获裸文本,而include()只会导致其他脚本作为ajax-ed脚本的一部分运行,而这个脚本将会破坏整个点。 我想长期我可以修改'推'服务器是全双工的,允许最初的数据从网页直接传输到一个asynchronous的“农场服务器”(我知道ReactPHP是有能力的,就像节点.js),但作为套接字服务器编程的n00b,我认为最好避免它,直到我可以完成一个工作模型。
如果有什么我错过了,那么让我知道,我讨厌不安全的网站就像你一样!
好的,我已经解决了!
问题是由于系统中安装了许多不同的PHP版本(我将系统从共享托pipe域移植到私有服务器,携带所有相关的行李)。 Apache使用的是php5.4,在5.6上安装了ZMQ。
我将所有的php 5.4文件夹重命名为php54_old,并创build了一个链接到所有相关的php 5.6文件夹(sudo ln -s / etc / php56 / etc / php54)。 我相信这与其sudo权限(上面)结合允许它工作,虽然我会testing它是否工作没有sudo权限,当我部署网站。 我不舒服,因为许多原因,Apache具有sudo权限 – 在此期间,我已经限制Apache的sudo权限,只执行php。
编辑:哦,我也卸载并重新安装ZMQ PEAR包和zmq php包装。