我长期奔跑的laravel 4命令一直被杀死

时间:2015-01-14 18:37:49

标签: php laravel command kill-process

我有一个实现laravel命令的laravel 4 web项目。

在开发家园vm中运行时,它会一直运行(总时间约为40秒)。

但是,当在生产服务器上运行它时,它会在命令行上以“已杀死”输出退出。

起初我认为这是cli php.ini中的max_execution_time,所以我将其设置为0(无限时间)。

如何找出杀死我命令的内容?

我使用标准的artisan invokation在ssh终端上运行它:

php artisan commandarea:commandname

laravel 4在某处有命令时限吗?

vps是一台带有mysql,nginx和php-fpm的Ubuntu 4.10机器

3 个答案:

答案 0 :(得分:7)

所以,首先,谢谢大家指出我关于PHP和laravel内存使用情况跟踪的正确方向。

我已经回答了我自己的问题,希望将来有利于laravel开发者,因为我的解决方案很难找到。

输入' dmesg'显示系统消息。我发现php脚本被Linux杀死了。

所以,我在脚本的每个关键区域之前和之后都将内存日志记录调用添加到我的脚本中:

Log::Info('Memory now at: ' . memory_get_peak_usage());

然后我在观看日志输出的同时运行脚本,并且还输出了“#top;'命令。

我发现即使我的方法结束且变量超出范围,内存也没有被释放。

我尝试的事情, DIDNT 在我的案例中有所不同:

  1. 在我完成变量后对变量进行unset($ varname) - 希望让GC启动
  2. 在脚本开头添加gc_enable(),然后在未设置大量变量后添加gc_collect_cycle()调用。
  3. 禁用mysql事务 - 认为可能是内存密集型 - 它不是。
  4. 现在,奇怪的是,以上都没有任何区别。我的剧本在被杀的时候仍然使用150mb或ram!

    实际运作的解决方案:

    现在这绝对是一个特定的解决方案。 但我的脚本目的基本上是解析一个大的xml feed,然后使用Elequent ORM将数千行插入到mysql中。

    事实证明,Laravel创建了日志信息和对象,以帮助您查看查询性能。

    通过以下'魔术'将其关闭。打电话,我把我的剧本从150mb降到了20mb左右!

    这是魔法;'拨打:

    DB::connection()->disableQueryLog();
    

    当我发现这个电话时,我可以告诉你,我正抓住稻草; - (

答案 1 :(得分:3)

过程可能会因以下几个原因而被杀死:

内存不足

有两种方法可以触发此错误:超过在php.ini中分配给PHP脚本的内存量,或超过可用的系统内存。检查PHP错误日志和php.ini文件以排除第一种可能性,并使用dmesg输出检查第二种可能性。

超出执行超时限制

在您的帖子中,您表明您已通过max_execution_time设置禁用了超时,但我已将其包含在此处以确保完整性。确保php.ini中的设置正确并且(对于那些使用Web服务器而不是CLI脚本的设置)重新启动Web服务器以确保新配置处于活动状态。

堆叠错误

如果您的脚本没有错误且没有遇到上述任何一种错误,请确保您的系统按预期运行。使用Web服务器时,请重新启动Web服务器软件。检查错误日志以查找意外输出,并停止或升级相关的守护程序并且需要。

答案 2 :(得分:1)

在Laravel / Spark项目中遇到此问题。只是想分享其他人是否有这个问题。

如果在更积极的方法之前运行Vagrant或Ubuntu,请尝试刷新/重新启动您的开发服务器。

我不小心在Vagrant服务器上运行了依赖包的安装。我还在安装错误期间反复删除并替换了镜像文件夹。我的错误发生在Laravel / Spark 4.~上。我能够在其他项目上运行迁移;在几乎所有命令的特定项目中,我很快就被“杀死”了300毫秒的时间框架。阅读其他用户,我害怕试图找到问题或腐败。在我的情况下,快速的Vagrant重新加载就可以了。遇害问题已经解决。