我正在开发一个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将是动态的,可能是针对每个页面请求。
答案 0 :(得分: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");