Php Laravel缓存视图或控制器响应

Php Laravel缓存视图或控制器响应,php,laravel,caching,Php,Laravel,Caching,我有一个观点博客 header.blade.php - prints dynamic navbar along with categories and login info. content.blade.php - prints dynamic content of the page. sidebar.blade.php - prints dynamic related articles. footer.blade.php - prints static & some php d

我有一个观点博客

header.blade.php - prints dynamic navbar along with categories and login info.

content.blade.php - prints dynamic content of the page.

sidebar.blade.php - prints dynamic related articles. 

footer.blade.php - prints static & some php dynamic content(date). 
我需要的是缓存content.blade.phpsidebar.blade.phpfooter.blade.php。据我所知,这将有助于减少负载

我不想缓存header.blade.php,因为它会打印当前用户信息和一些动态js变量

对于控制器,我想缓存函数名(参数变量)。这样,如果第二次调用具有相同参数的同一函数,响应将立即写回,而不与db通信,如mem cahche,但不使用它

我需要对缓存进行控制的可能性

我已经看过了。但我很不高兴看到它仍然进展缓慢


我试图在磁盘上创建html文件作为缓存,但这似乎减少了控制器,增加了所有第一次响应的ttfb

你要求做的事情相当复杂。我以前经历过这个问题,并且已经解决了它,但是我不推荐这个解决方案,原因我将在后面解释。首先,有必要阅读Laravel视图模块(vendor/Laravel/framework/src/illumb/View)中的代码来了解发生了什么

刀片模板(filename.blade.php)被编译成一个php文件,该文件保存在storage/framework/views中,名为.php。将刀片渲染为HTML所花费的大部分时间实际上都是在将这些视图编译为PHP时花费的

一旦这些视图在磁盘上,PHP引擎就会从磁盘将它们呈现为PHP代码。让PHP引擎从内存编译代码是非常棘手的,事实上,这样做并不比从磁盘编译代码快多少,因为它需要一个eval()调用,这在PHP中很慢,而不是include()调用。此外,由执行include()调用的PHP编译器创建的操作码被缓存在操作码缓存中(假设您有),而由eval()调用创建的操作码则不是,这意味着如果刀片服务器在内存中,则每次eval()调用都必须调用PHP编译器

因此,我建议:

  • 忽略将.blade编译成PHP并将其存储在RAM中的诱惑,它不会对您起作用
  • 在存储/framework/views目录上放置一个ramdisk(例如/dev/shm)以加快访问速度——例如,将该目录链接到/dev/shm(启动时必须这样做),或者为其添加一个特定的fstab条目
  • <> LI>如果缓存视图确实是您需要的速度,那么考虑另一个模板引擎,如SMATY,它可以从RAM编译,而不编译到PHP代码。

我希望这有帮助。可以缓存View::phpEngine编译器(它从PHP代码创建HTML)的输出,但它很混乱,并且在Laravel中涉及一些令人讨厌的黑客攻击。我曾经为Laravel 3做过一次,但回报不好,我不建议再尝试一次。

您要求做的事情相当复杂。我以前经历过这个问题,并且已经解决了它,但是我不推荐这个解决方案,原因我将在后面解释。首先,有必要阅读Laravel视图模块(vendor/Laravel/framework/src/illumb/View)中的代码来了解发生了什么

刀片模板(filename.blade.php)被编译成一个php文件,该文件保存在storage/framework/views中,名为.php。将刀片渲染为HTML所花费的大部分时间实际上都是在将这些视图编译为PHP时花费的

一旦这些视图在磁盘上,PHP引擎就会从磁盘将它们呈现为PHP代码。让PHP引擎从内存编译代码是非常棘手的,事实上,这样做并不比从磁盘编译代码快多少,因为它需要一个eval()调用,这在PHP中很慢,而不是include()调用。此外,由执行include()调用的PHP编译器创建的操作码被缓存在操作码缓存中(假设您有),而由eval()调用创建的操作码则不是,这意味着如果刀片服务器在内存中,则每次eval()调用都必须调用PHP编译器

因此,我建议:

  • 忽略将.blade编译成PHP并将其存储在RAM中的诱惑,它不会对您起作用
  • 在存储/framework/views目录上放置一个ramdisk(例如/dev/shm)以加快访问速度——例如,将该目录链接到/dev/shm(启动时必须这样做),或者为其添加一个特定的fstab条目
  • <> LI>如果缓存视图确实是您需要的速度,那么考虑另一个模板引擎,如SMATY,它可以从RAM编译,而不编译到PHP代码。

我希望这有帮助。可以缓存View::phpEngine编译器(它从PHP代码创建HTML)的输出,但它很混乱,并且在Laravel中涉及一些令人讨厌的黑客攻击。我曾经为Laravel 3做过一次,但回报不好,我不建议再尝试。

感谢您的回答。我完全同意你的看法。即使在多年的PHP专业经验之后,我也不喜欢它,因为它无法提供我经常需要的完整控件。我想我可能会创建一个新的框架,只是为了获得这个功能。也许现在是时候换一种语言了,你有没有建议像RoR这样的语言?谢谢你的回答。我完全同意你的看法。即使在多年的PHP专业经验之后,我也不喜欢它,因为它无法提供我经常需要的完整控件。我想我可能会创建一个新的框架,只是为了获得这个功能。也许现在是时候换一种语言了,你有没有建议像RoR这样的语言?