【问题标题】:PHP exec() in Ubuntu -- is there a limitation to the size of arguments you can pass in?Ubuntu 中的 PHP exec() - 可以传入的参数大小是否有限制?
【发布时间】:2011-12-19 05:40:39
【问题描述】:

我看到命令行中的“getconf ARG_MAX”返回一个大数字(2,097,152 字节),而我传递给 exec 的参数只是其中的一小部分(229,650),但我的 exec 一直在死去,我不能找出原因。它适用于传入的较小参数。

示例代码: $strReallyLongParamList = 'ARG1 ARG2-IS-200K ARG3 ARG4'; exec('/path/to/my/background-process.php '.$strReallyLongParamList); //从后台进程.php 记录从未发生过...代码似乎在 exec 调用中死了

PHP 是在内部受到限制还是只是将所有内容传递给 Ubuntu?

我已经将我的 exec 调用分块成更小的批次并且所有的工作都很好,所以看起来我在 PHP exec 中遇到了某种类型的限制。

【问题讨论】:

  • 一些示例代码会很好,请编辑您的问题
  • 也许你最好把所有的逻辑放到一个shell脚本中并通过exec()执行?
  • 如果你甚至不得不考虑如果你的参数列表太长,你真的应该考虑使用标准输入来传递那些长参数......
  • 我在使用 drush 命令和 --structure-tables-list="field*" 时遇到了同样的问题,其中有数百个以 field 开头的表。知道那个 229650 数字是从哪里来的吗?

标签: php bash ubuntu background-process


【解决方案1】:

这篇文章:http://www.in-ulm.de/~mascheck/various/argmax/ 从 shell 角度分析了问题,但对根本问题给出了一些见解,即 ARG_MAX 大小是参数加上环境。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我猜这个错误是因为你不能直接执行一个 PHP 文件:

    exec('/path/to/my/background-process.php '.$strReallyLongParamList);
    

    您必须执行以下操作,即执行实际程序,例如 PHP 解释器:

    exec('php /path/to/your/background-process.php '.$params);
    

    但老实说,我认为将 exec 用于此类任务不是一个好主意,如果您不知道自己在做什么,这只是一个太大的安全风险。你到底想做什么?

    【讨论】:

    • 不要“有”调用php解释器...只需使用文件的第一行指定解释器:#!/usr/bin/php
    【解决方案3】:

    任何传递给命令行的变量参数都应该用escapeshellarg转义

    我认为,这应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多