采用此(非)刀片脚本list.blade.php
:
<?php
error_log( print_r( "START" , true ) );
global $i;
for ( $a = 0 ; $a < 3 ; $a++ ) {
$j = @(int)$i;
error_log( print_r( $j , true ) );
echo $j;
$i = $j + 1 ;
}
error_log( print_r( "STOP" , true ) );
预期结果应为012
,但输出为345
!
如果检查服务器错误日志,可以看到:
START
0
1
2
STOP
START
3
4
5
STOP
因此,模板第一次运行而不输出任何内容,它会再次运行,然后发送输出。
我使用的是更新的Laravel 4.2版本。这不是一个真正的问题,但是当每个解析的行请求繁重的计算任务时,加载时间只是X2。
你认为这是一个错误还是正常行为?
有没有办法在首次启动(干运行)时避免模板中的某些执行?
答案 0 :(得分:1)
发现问题,但不是解决方案!我使用我的Laravel样板,但它是罪魁祸首。我使用全局后置过滤器来动态缩小HTML代码(为此问题添加了错误日志):
App::after(function ($request, $response) {
// Minify only texts
if ( strpos( $response->headers->get('content-type') , 'text/' ) !== false ) {
if ($response instanceof Illuminate\Http\Response) {
error_log( print_r( 'coucou1' , true ) );
$output = $response->getOriginalContent();
error_log( print_r( 'coucou2' , true ) );
$re = '%# Collapse whitespace everywhere but in blacklisted elements.
(?> # Match all whitespans other than single space.
[^\S ]\s* # Either one [\t\r\n\f\v] and zero or more ws,
| \s{2,} # or two or more consecutive-any-whitespace.
) # Note: The remaining regex consumes no text at all...
(?= # Ensure we are not in a blacklist tag.
[^<]*+ # Either zero or more non-"<" {normal*}
(?: # Begin {(special normal*)*} construct
< # or a < starting a non-blacklist tag.
(?!/?(?:textarea|pre|script)\b)
[^<]*+ # more non-"<" {normal*}
)*+ # Finish "unrolling-the-loop"
(?: # Begin alternation group.
< # Either a blacklist start tag.
(?>textarea|pre|script)\b
| \z # or end of file.
) # End alternation group.
) # If we made it here, we are not in a blacklist tag.
%Six';
error_log( print_r( 'coucou3' , true ) );
$output = preg_replace( $re , " " , $output );
error_log( print_r( 'coucou4' , true ) );
if ($output !== null) {
$response->setContent($output);
}
error_log( print_r( 'coucou5' , true ) );
}
}
});
并且错误日志结果非常令人惊讶:
START
0
1
2
STOP
coucou1
coucou2
coucou3
START
3
4
5
STOP
coucou4
coucou5
在以下行中第二次评估刀片模板:
$output = preg_replace( $re , " " , $output );
这在PHP中是不可能的...我想我错过了Laravel架构设计......如果有人理解任何事情......
答案 1 :(得分:0)
这不是答案。我刚用您的代码测试并得到了结果012
。我用版本4.2.6测试了它。我不知道你是怎么做到的。
这是我使用的代码。
应用程序/ route.php
Route::get("test",function(){
return View::make("aaa");
});
应用程序/视图/ aaa.blade.php
<?php
error_log( print_r( "START" , true ) );
global $i;
for ( $a = 0 ; $a < 3 ; $a++ ) {
$j = @(int)$i;
error_log( print_r( $j , true ) );
echo $j;
$i = $j + 1 ;
}
error_log( print_r( "STOP" , true ) );