2012-06-05 21 views
0

我有一個腳本,可以創建較大圖像的縮略圖,並且工作正常,問題在於它被放置在頁面的開頭,在這兩個圖像都被查看,並且每次有人訪問該頁面時都會運行我的理解。這似乎不是很好的表現。如何爲Windows和Unix製作一個php自動化後臺腳本?

我寧願腳本有它自己的頁面,當某個更大的圖像被添加到它掃描的目錄中時,它會以某種方式檢測到,然後開始工作。

我該如何設置或改進它?

找到了這個,不知道它是如何工作的。什麼是$ CMD:

/*I combined several efforts in this topic into one function: 
This will execute $cmd in the background (no cmd window) 
without PHP waiting for it to finish, on both Windows and Unix.*/ 
    function execInBackground($cmd) { 
     if (substr(php_uname(), 0, 7) == "Windows"){ 
      pclose(popen("start /B ". $cmd, "r")); 
     } 
     else { 
      exec($cmd . " > /dev/null &"); 
     } 
    } 
+1

你想要一個腳本來掃描一個目錄併爲每個添加(自動)添加的新文件創建一個縮略圖? –

+0

圖像如何到達服務器?如果它們已上傳,則可以在上傳時生成它們,否則使用croned腳本生成縮略圖。 – Devraj

+0

在傑克,是的。 @Devraj它的設置,所以我可以轉儲圖像在一個文件夾,因爲我讓他們。目前還沒有客戶端上傳器。 – expiredninja

回答

4

時基創作:也許(如果你有shell訪問),您可以創建一個 「cron作業」:

在'/etc/crond.d /''像這樣創建一個文件:

0 6-18 * * * root /path/to/your/script.php >> /dev/null 2>&1 

它將在每小時6.00到18.00之間執行。

請參閱:http://en.wikipedia.org/wiki/Cron瞭解更多詳情。

自動創建: 如果您有一個「上傳過程」,上傳後只需放置「縮略圖生成器」。

鉤子創建: 確實,它取決於您用於在目錄中添加新圖像的過程。

也許,你也可以在更新目錄後做一個鉤子來執行腳本。

但我認爲,基於時間(的cron)第一個解決方案是最容易實現的。

+0

這個cron的東西看起來很棒。沒有窗戶等效? – expiredninja

+1

我認爲你可以使用「計劃任務」:http://support.microsoft.com/kb/308569,但我更熟悉Liux :) – Akarun

+0

越來越遲,如果我稍後可以實現,將接受此答案。 – expiredninja

1

正如另一個答案指出,cron的將是你最好的選擇,但它是在Linux上使用只(也許Windows有另一種選擇)。 但是,如果您需要獨立於平臺的解決方案,或者無法訪問服務器的配置,則可以使用原始解決方案(在每次頁面加載時生成縮略圖),但使用CronExpression類對其效率進行修改:https://github.com/mtdowling/cron-expression

使用這個類,你會簡單地定義一個cron執行的表情,像這樣的:

0 6-18 * * * 

,然後檢查是否縮略圖再生任務應該執行:

$cron_expression = Cron\CronExpression::factory($cron_schedule); 
$next_run_date = $cron_expression->getNextRunDate(); 
if ($next_run_date <= new DateTime()) { 
    //execute task 
} 
1

你可以用幾種方法做到這一點。

的最好辦法,恕我直言,是打破腳本轉換爲「目錄掃描」部分,它決定什麼樣的圖像都需要縮略的比較來源和存在和目的的時間戳的時間戳。

第二部分縮略圖在一個時間只有一個圖像。

然後,您可以運行該腳本的第二部分,只有縮略圖時請求縮略圖圖像:

<?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()調用,它們相當快。除非你在數千張圖片上運行,否則你幾乎不用擔心。

相關問題