2014-02-16 67 views
0

我正在寫一個js文件並在頁面加載時執行它們的PHP項目。動態創建和加載JS

動態編寫JS文件並將腳本標籤附加到頁面html並僅執行每個頁面請求是否是一種好的做法?

這是我的工作創建和鏈接JS文件:

<?php 

if (!function_exists('setScript')) { 
    function setScript($script = null) 
    { 
     static $_script = array(); 
     if ($script == null) { 
      return $_script; 
      $_script = array(); 
     } else { 
      $_script[] = $script; 
     } 
    } 
} 

if (!function_exists('linkJs')) { 
    function linkJs($controllerName, $actionName) 
    { 
     $jsFileName = randomString(40) . '.js'; 
     $folderName = PUBLIC_DIR . DS . 'generated'; 
     if (!is_dir($folderName)) { 
      mkdir($folderName); 
      chmod($folderName, 777); 
     } 
     $fileName = $folderName . DS . $jsFileName; 
     $availableFiles = scandir($folderName); 
     unset($availableFiles[0]); 
     unset($availableFiles[1]); 
     foreach ($availableFiles as $file) { 
      $file = $folderName . DS . $file; 
      if (is_file($file)) unlink($file); 
     } 
     $script = "$(document).ready(function() {\n" . implode("\n", setScript()) . "});"; 
     file_put_contents($fileName, $script); 
     $url = loadClass('Url', 'helpers'); 
     return "<script type='text/javascript' src='" . $url->baseUrl() . 'public/generated/' . $jsFileName . "'></script>"; 
    } 
} 

if (!function_exists('alert')) { 
    function alert($message, $returnScript = false) 
    { 
     if (isAjax()) { 
      if ($returnScript) { 
       return "\nalert('$message');\n"; 
      } 
      echo "\nalert('$message');\n"; 
     } else { 
      setScript("\nalert('$message');\n"); 
     } 
    } 
} 

請建議,如果這是這樣做的一個很好的做法或任何其他方式,我可以做到這一點。

約30-40位用戶將同時登錄到網站,每秒約有5-10頁的請求。 (這些是預測,可能會變高)。

正在寫js文件(到硬盤驅動器)並鏈接它是一個好習慣,或者只是將原始腳本添加到html主體是一個很好的做法,因爲寫入js文件會使js不受干擾。

此外,生成的JavaScript將是動態的,可能爲每個頁面請求。

+1

好吧,這取決於腳本的動態性。如果他們改變很多:是的,這會起作用。否則,我通常會將它們放入由瀏覽器加載並存儲在緩存中的單獨文件中。但是,如果JS改變很多,這意味着你的緩存每次都必須刷新,這要比頁面本身更長。所以......這取決於你的JS的動態。 – Tularis

+0

yes @Tularis,腳本將變得非常動態 – Guns

+2

Aside:不是'return'alert('$ message');「;',你應該使用$ json_message = json_encode($ message);返回「警報($ message);」;'。 – DCoder

回答

3

如果您看不到每次都動態生成的其他選擇(我的猜測是每個請求的腳本內容至少有80%不同),那麼將腳本直接寫入html文件中,因爲鏈接將導致瀏覽器發出另一個請求來包含腳本。

您已經通過動態生成文件而降低了性能。

這樣做,我能想到的是實際創建一個PHP腳本,通過自身產生的js,然後創建的.htaccess重寫規則重寫/script/generator/{HASH_FOR_REQUEST}.js/path/to/php-script-generator.php,這樣就可以利用瀏覽器緩存如果最好的方法請求是一樣的。但是,如果它只是關於JS的具體細節發生變化,並且js函數體仍然非常相似(即,您正在使用js將信息報告給客戶端),那麼可以考慮將js寫入php文件然後使用php內聯標籤來回顯你需要改變的東西。

例如:

當一個查詢字符串它會報到什麼是查詢加載這個腳本會寫一個警惕JS這樣的話......

<?php 
    // disable output buffering 

    /* the reason for this is that the browser will wait 
    * for the first byte returned before continuing with the page. 
    * If it has to wait for the whole file performance will be degarded. 
    */ 

    while(ob_get_level() != 0) ob_end_clean();  

    header("Content-type:text/javascript"); 

    // it is wise to set some cache headers here 


    if(isset($_GET['message']) { 
     $message = urldecode($_GET['message']); 
    } else { 
     $message = "No message!"; 
    } 
?> 

// write the js... 
alert("<?php echo $message; ?>"); 

通過請求/path/to/script.php?message=hello+world該腳本將返回alert("hello world");

+0

太棒了!這解釋了所有。謝謝! – Guns