Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:内存优化入站邮件_Php_Json_Base64_Inbound - Fatal编程技术网

PHP:内存优化入站邮件

PHP:内存优化入站邮件,php,json,base64,inbound,Php,Json,Base64,Inbound,在我的PHP应用程序中,我使用入站钩子接收邮件。该服务接收邮件并将其发送到我服务器上的URL,该服务工作正常 我遇到的问题是,当邮件的附件超过10MB时 导致 PHP致命错误:允许的内存大小为104857600字节,已耗尽 (尝试分配1821693字节) 我在这一行所做的是: $in = json_decode(file_get_contents("php://input")); 我有两个问题: 有没有一种方法可以提高内存效率 为什么10MB的邮件会失败,而内存限制实际上是100MB?Base

在我的PHP应用程序中,我使用入站钩子接收邮件。该服务接收邮件并将其发送到我服务器上的URL,该服务工作正常

我遇到的问题是,当邮件的附件超过10MB时

导致

PHP致命错误:允许的内存大小为104857600字节,已耗尽 (尝试分配1821693字节)

我在这一行所做的是:

$in = json_decode(file_get_contents("php://input"));
我有两个问题:

  • 有没有一种方法可以提高内存效率
  • 为什么10MB的邮件会失败,而内存限制实际上是100MB?Base64+JSON编码是否会产生比原始大小大10倍的开销
  • 使用内存进行调试后编辑\u获取\u用法()

    Script start
    47MB memory usage.
    $in = file_get_contents("php://input");
    63MB memory usage.
    json_decode($in);
    PHP terminates, due to memory size exhausted.
    
    有趣的是,该脚本已经开始使用47MB的内存,而没有发出任何命令。我想这是因为输入数据太大了吧?可能是因为PHP将其存储在$HTTP_RAW_POST_数据中


    有没有什么php.ini指令可以让php创建更少的变量?

    电子邮件附件存储为base64,因此实际的电子邮件正文大约要大2倍,所以我们有20mb

    json_encode(在发送方)还可以增加base64开销,因此我们可以为单个文件_get_contents调用提供大约40mb的数据,然后json_decode将需要大约20mb的数据,添加一些局部变量,并且至少需要1个循环,100mb的数据将被耗尽

    我建议您阅读:-使用它来跟踪php分配内存的位置

    然后使用和

    更新: 我不知道为什么json_解码需要这么多内存(可能是一些bug,更新php?),不管是在php.ini中

    register_globals = off
    register_long_arrays = Off
    register_argc_argv = Off
    auto_globals_jit = On
    always_populate_raw_post_data = Off
    
    你的第二个问题:

    因此,MIME兼容Base64编码的二进制数据的实际长度通常约为原始数据长度的137%


    JSON不应该增加很大的开销,但将邮件正文额外编码到JSON中可能会再次使用base64。到目前为止,我还没有使用过
    memory\u get\u usage
    ,但从现在起,如果有机会,我会使用它。向上投票。谢谢你的内存使用调试提示+1我刚刚用调试结果更新了我的问题。PHP版本是5.4.9。通过在脚本启动后取消设置所有全局变量,我成功地将初始内存大小减少了一点(从47MB减少到31MB)。我想这就是我能做的,除了增加内存限制。未结算(全球);取消设置($\服务器);未设置($\u-GET);取消设置(美元邮政);取消设置($\u文件);取消设置($\请求);未设置($_ENV);未设置($\u COOKIE);未设置($HTTP\u原始\u后期\u数据);unset($http\u response\u头);未结算($argc);未结算($argv);gc_collect_cycles()@JochenJung看,也许您可以使用自己的JSON解析器,因为您知道格式是固定的?