如何使用PHP在服务器上快速复制2000个图像


How to copy 2000 images on server using PHP really fast?

我有一个PHP文件(网站上的功能),它允许用户从另一个网站上的帐户导入数据
每次他想要导入数据时,我还需要从那里复制很多图像
例如,500张图片,300-500Kb每一张都是最小的。预计这个数字很容易为一个用户提供2000个图像

每张图片的步骤是:

  • 获取图片URL
  • 从URL生成图像(通过使用imagecreatefromjpeg等)
  • 将其保存在我的服务器上(使用imagejpeg、imagepng等功能)

执行此代码已经需要很长时间(超过8分钟)
我意识到这是大量的数据,但有其他可能的方法吗
也许在后台运行复制,或者同时复制多张图片
我只是想知道是否有专门为此设计的技术,但我不知道。
或者,除了将图像工作外包给某个图像托管服务器并只保留缩略图之外,没有其他方法

谢谢。

这里没有太多信息。正在使用什么操作系统?源站点的"远程"程度如何?图像的格式是什么?

如果另一个站点是远程的(即不同的托管公司),那么您将面临的主要问题是源服务器将数据传输到您的计算机的速度。

然而,一个大问题是"目前图像的格式是什么?"。如果图像已经是JPEG,那么检索并再次转换为JPEG将降低质量(尽管略有降低)。更好的做法是直接复制图像文件。这将删除PHP应用程序重新编码JPEG所需的时间。问问自己-你真的需要转换图像吗?

根据可用的操作系统命令,您可能最好调用处理传输的应用程序(例如Linux中的wget)。我已经使用wget将文件从远程服务器检索到本地服务器,运行起来并不太困难。

记住,你的转会步骤越多,需要的时间就越长。目前,您有:

  • 检索
  • 转换
  • 书写

全部由PHP处理(可能从最慢到最快)

源主机是否为客户提供存档或导出功能?如果是的话,是否可以将其用于批量传输文件?

尽可能多地使用PHP将使过程更快。调用系统函数(例如,wgetftpsshimagemagick等)会使事情变得更快(在PHPApache之外)

线程似乎是显而易见的答案。。。

https://github.com/krakjoe/pthreads

我是成百上千的人中的一个声音,他们说PHP没有线程的可能性。。。我认为目前转向卷曲为你穿线的趋势很糟糕,而吹捧是一种更糟糕的解决方案,这种事情的开销一定很可怕。。。

PHP一直都有多线程的工具,如果没有它们,它就不会有现在的成就,因为它不支持任何多线程web服务器。只是这不是该语言的设计目标,到目前为止,将userland线程引入PHP的外部努力是不可用的,甚至在谷歌代码中也不存在。。。我要求PHP为即将到来的项目提供线程,所以线程我将。。。你和其他人也一样,这是我送给世界/网络的礼物,尽情享受:)

  1. 设置某种队列来处理图像导入-这样用户就不会等待,脚本也不会超时。

  2. 尝试使用curl_multi_init()运行并行请求

这是一个PHP函数,您可以使用它将文件从internet($url参数)下载到服务器上的本地文件($file_path参数):

function download_file($url, $file_path) {
   $out = fopen($file_path, 'wb');
   if ($out == FALSE){
      print "File not opened<br>";
      exit;
   }
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_FILE, $out);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_URL, $url);   
   curl_exec($ch);
   //echo "<br>Error is : ".curl_error ( $ch);
   curl_close($ch);
   fclose($out);
}

你可以这样称呼它:

$url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Iss030e015472_Edit.jpg/352px-Iss030e015472_Edit.jpg';
download_file($url,'/var/www/www.mysite.com/public_html/images/image_user1.jpg');

确保将文件保存到的文件夹对您的apache用户具有写入权限。还要确保您已经加载了cURLphp扩展插件,以便正常工作。

这个函数应该比imagecreatefromjpeg方法快得多。尝试一下,如果你仍然觉得它对你来说很慢,你可以像Gabriel建议的那样,通过实现一个队列来并行运行多个请求来改进它。