【问题标题】:Upload script too long to execute上传脚本太长无法执行
【发布时间】:2014-02-24 13:08:24
【问题描述】:

所以,我有一个脚本用于调整大小、保存 gif 并将此 gif 的预览图像保存在我的服务器上。

这是我的脚本:

public function createImageGif($gif, $x, $y, $w, $h)
    {
        $image = new Imagick();
        $decoded = base64_decode($gif);
        $image->readimageblob($decoded);
        $image = $image->coalesceImages();

        $image_name = uniqid(rand()).'.gif';

        foreach ($image as $frame) { //gif creation
          $frame->cropImage($w, $h, $x, $y);
          $frame->thumbnailImage(117, 135);
          $frame->setImagePage(117, 135, 0, 0);
        }

        $image = $image->deconstructImages();
        $image->writeImages('uploads/profiles/'.$image_name, true);

        //preview creation
        $im = imagecreatefromstring($decoded);
        if ($im !== false) {
            header('Content-Type: image/gif');
            $newimage = imagecreatetruecolor(117, 135);
            imagecopyresampled($newimage, $im, 0, 0, $x, $y, 117, 135, $w, $h);
            imagegif($newimage, 'uploads/profiles-preview/'.$image_name.'', 100);
            imagedestroy($newimage);
            imagedestroy($im);
        }

        return $image_name;
    }

所以,$gif 最初是一个长字符串 blob(大约 2 000 000 个字符)。最后,我服务器上的 gif 大小约为 300ko。

此脚本需要 20 多秒才能执行。我有良好的连接和良好的服务器。

如何优化这个脚本?有什么想法吗?

编辑:这是我在 javascript 中创建数据的脚本:

var base64data;
          var img = document.createElement('img');
          var reader = new window.FileReader();
          reader.readAsDataURL(blob);
          reader.onloadend = function() {
            base64data = reader.result;
            img.src = base64data;
          }

【问题讨论】:

  • 嗨克莱门特。您可以放置​​一些断点并更接近代码的“挂起”部分。这可能会更容易帮助您改进代码。如果你不能做断点,你可以做一些 echo 1;出口;并找到代码“挂起”的地方。
  • 嗯,我的问题不在于我的 PHP 脚本,而在于我的 ajax 请求。我正在尝试使用 jquery ajax 发送一个非常大的字符串(在我编辑的 img.src 中)。所以,问题是ajax

标签: php optimization upload


【解决方案1】:

为什么您的脚本使用 blob binary64 编码作为输入?做这件事有很多合理的理由,但你确定有必要吗?你不能从 PHP temp 的文件夹中加载图像吗?

也许,您正在从 javascript 函数上传图像,通过 ajax,base-64 编码图像(从画布动态创建?)并将其作为 POST 参数中的字符串发送

另外,我看到您先保存图像,然后重新打开它以将回复发送回客户端。为什么不发回刚刚调整大小的图像(包含在 $image 变量中的图像)

【讨论】:

  • $gif 是用 javascript 创建的,来自网络摄像头 ;) 我不明白你的第三点..
  • 忘掉第三点,我没有仔细阅读你的代码。我的错。大约一年前,我在使用 jQuery 库用相机截屏时遇到了同样的问题,我仍然记得我的代码中的问题:从 javascript 到服务器的图像编码!您是否发送编码为 base_64 的图像,连接像素的所有 8 位值?这可以解释为什么您的图像在到达服务器之前往往会从 300k 爆炸到 2M。这种转换是问题减慢整个事情
  • 你能发布一小段正在发送到服务器的字符串吗? base64编码之前
  • 在base64encoding之前,它只是一个blob对象。我用 base64 编码这个 blob,并将数据放入 myImage.src
  • 我的建议是使用 html 的 canvas 对象将图像转换为 png 对象客户端,并发送该对象 base_64 编码(如我在上一条评论中链接的库中所述)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 2015-12-24
相关资源
最近更新 更多