你可以用幾種方法做到這一點。
的最好辦法,恕我直言,是打破腳本轉換爲「目錄掃描」部分,它決定什麼樣的圖像都需要縮略的比較來源和存在和目的的時間戳的時間戳。
第二部分縮略圖在一個時間只有一個圖像。
然後,您可以運行該腳本的第二部分,只有縮略圖時請求縮略圖圖像:
<?php
...
$run = true;
if (file_exists($thumbnail))
if (filemtime($thumbnail) > filemtime($source))
$run = false;
if ($run)
{
// run, say, ImageMagick and convert $source to $thumbnail
if (!$success)
$thumbnail = './images/sorry-error-in-thumbnailing.jpg';
}
Header("Content-Type: image/jpeg");
Header("Content-Length: " . filesize($thumbnail));
readfile($thumbnail);
?>
當然,如果你是容易在某一時刻產生大量的縮略圖,這很危險,因爲你可能會運行大量的縮略圖的副本,佔用你的服務器CPU。
Let me clarify: you put the above script in place of IMG SRC="thumbnail1234.jpg"
request. Then the user viewing the page with the thumbnails will start several
requests for thumbnail.php?source=image123, ...?source=image235 and so on. They
will run in parallel, and most of them (if the thumb is there) can read the thumbnail
or issue a 302 Redirect to it, both very fast and with little server load.
ONLY IF the thumbnail isn't there, THAT image will appear after a delay because it
is generated and served directly. The user will see most, maybe all, images loading
instantly, and some of them lag behind a little (ideally).
在這種情況下,你可以popening之前運行系統負載檢查,或者你可以保持一個流水賬正在運行的進程。
您可以通過檢查「tempthumbnail.jpg」是否存在且不超過$ SECONDS秒,將$ source改爲tempthumbnail.jpg,然後將tempthumbnail重命名爲$ thumbnail;和/或如果系統允許可靠使用flock()。或者你可能存儲在數據庫中運行的進程數量:
query("UPDATE sysvars SET runner = runner + 1;");
shell_exec("...");
query("UPDATE sysvars SET runner = runner - 1;");
否則,你可以時不時運行腳本,通過cron或同時在腳本的開始,當你看到前面跑了超過$ TIME秒前。或者,您可以在上傳要翻動的圖像時檢查標誌(或源目錄的filemtime())。
在後一種情況下,如果您控制上傳,請在上傳完成後立即運行編號。用戶的上傳將序列化您的翻錄過程,並且很難不管是否執行了「顯示」新圖像的操作將在上傳後立即激活;因此,反過來說,當用戶說「OK,激活圖像12345」時,相反極可能是12345的縮略圖已經完成並準備好「立即」顯示。
很大程度上取決於翻譯腳本如何運行。如果它總是重新生成所有縮略圖,那麼效率就會降低。如果它檢查,那麼「空運行」就是讀取整個目錄和一堆stat()調用,它們相當快。除非你在數千張圖片上運行,否則你幾乎不用擔心。
你想要一個腳本來掃描一個目錄併爲每個添加(自動)添加的新文件創建一個縮略圖? –
圖像如何到達服務器?如果它們已上傳,則可以在上傳時生成它們,否則使用croned腳本生成縮略圖。 – Devraj
在傑克,是的。 @Devraj它的設置,所以我可以轉儲圖像在一個文件夾,因爲我讓他們。目前還沒有客戶端上傳器。 – expiredninja