草庐IT

php - 从 PHP 脚本调用 "php"命令导致奇怪的进程行为

coder 2024-04-22 原文

我刚刚将网站从一台主机移至另一台主机。服务器环境非常相似(LAMP 堆栈),所有代码在传输时都能正常工作,除了一行。我对它进行了一些改动以进行测试,但仍然得到非常奇怪的结果:

<?php
$out = `php ../test/test.php 123 abc`;
?>

在 SSH 中从命令行运行 php ../test/test.php 123 abc 时,它工作正常,正如预期的那样。当我在 SSH 中运行:php testrunner.php(上面只有“$out”行的文件)时,它也按预期工作。

但是一旦我从浏览器加载testrunner.php,它就会挂起。使用 ps aux | grep php 来监视进程,进程似乎产生和消亡(为简洁起见被截断):

myuser   12790  0.0  0.3 259016 45284  . . . 0:00 php ../test/test.php 123 abc

如果我将“$out”行修改为:

<?php
$out = `php ../test/test.php 123 abc &`;
?>

然后我使该脚本在后台运行。令人惊讶的是,几秒钟后,当我运行 ps aux | grep php 再次显示相同的内容,但使用了新的 PID。我一直在运行 ps aux 并不断看到它具有不同的 PID。这会持续相当长的一段时间(几秒,甚至一分钟)。

这对我来说很奇怪,因为 test.php 只有一行来回显一些用于测试目的的文本。

在终端上工作正常。从 web 调用时挂起并有其他奇怪的行为。我错过了什么吗?

(我通过将输出重定向到一个日志文件来证明,当从 Web 浏览器运行时,PHP 脚本似乎调用了 ITSELF 而不是另一个脚本 test.php。当它表现得像这样时,它不会'没有收到任何 $argv 参数...但是当我从命令行运行它时,一切都很好!奇怪吗?)

更新:天哪……我只是在观察服务器进程,test.php 的 PHP 进程开始失控。它们成百上千个进程:服务器停机一分钟,SSH 和一切。现在恢复了,但我无法解释发生了什么。代码中没有循环,所涉及的两个文件都非常简单,为了测试目的而隔离...

当我的主机响应我的支持请求时,我正在与他们一起工作,以查看这是否与环境相关或者是什么...仅通过更改服务器环境可能导致这种情况发生的原因是什么?

最佳答案

我的房东 A Small Orange 提供了帮助,但最后,我或他们能想到的只有(来 self 的支持票):

... that SuPHP or some other security-based software we have running as part of our stack is preventing your processes from spawning new processes (because that behavior can be insecure for obvious reasons) ...

无论如何,这些脚本在我的 Macbook(与 nginx 的配置非常不同)和我旧主机的 LAMP 堆栈上运行良好,ASO 具有类似的设置。

也许我会询问在不调用命令行的情况下生成长时间运行的进程,这样调用脚本就不会在另一个问题中被阻塞。

关于php - 从 PHP 脚本调用 "php"命令导致奇怪的进程行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14765708/

有关php - 从 PHP 脚本调用 "php"命令导致奇怪的进程行为的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  7. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  8. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  9. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  10. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

随机推荐