我正在使用CakePHP 2.4.7和CakeDC的TinyMCE插件。
我将CakePHP核心以及插件设置在我服务器上的共享位置,以便多个应用程序可以访问它。这使我不必更新TinyMCE的多个副本。在迁移到新服务器和更新软件之前,一切运行良好。
新服务器运行Apache 2.4而不是2.2并使用mod_ruid2而不是suexec。
我在尝试加载编辑器时遇到此错误:
致命错误(4):语法错误,[/xyz/Plugin/TinyMCE/webroot/js/tiny_mce/tiny_mce.js,第1行]中的意外T_CONSTANT_ENCAPSED_STRING
我该如何开始调试?
我尝试将应用程序的webroot中的符号链接添加到TinyMCE的插件webroot。这是因为它加载了js文件和编辑器,但是TinyMCE插件正在处理错误的当前目录,文件管理也不会分开。
答案 0 :(得分:3)
问题是AssetDispatcher
过滤器,它包含使用PHP css
语句的js
和include()
文件,导致文件通过PHP解析器发送,在那里它将会在TinyMCE脚本中发现<?
。{/ p>
请参阅https://github.com/.../2.4.7/lib/Cake/Routing/Filter/AssetDispatcher.php#L159-L160
非常讨厌,如果你问我的话,因为它是无证的,非选择性的危险行为。
如果您想继续使用插件资产调度程序,请扩展内置资源调度程序,并重新实现AssetDispatcher::_deliverAsset()
方法并删除包含功能。当然这有点烦人,维护明智,但它是一个非常快速的解决方案。
类似的东西:
// app/Routing/Filter/MyAssetDispatcher.php
App::uses('AssetDispatcher', 'Routing/Filter');
class MyAssetDispatcher extends AssetDispatcher {
protected function _deliverAsset(CakeResponse $response, $assetFile, $ext) {
// see the source of your CakePHP core for the
// actual code that you'd need to reimpelment
ob_start();
$compressionEnabled = Configure::read('Asset.compress') && $response->compress();
if ($response->type($ext) == $ext) {
$contentType = 'application/octet-stream';
$agent = env('HTTP_USER_AGENT');
if (preg_match('%Opera(/| )([0-9].[0-9]{1,2})%', $agent) || preg_match('/MSIE ([0-9].[0-9]{1,2})/', $agent)) {
$contentType = 'application/octetstream';
}
$response->type($contentType);
}
if (!$compressionEnabled) {
$response->header('Content-Length', filesize($assetFile));
}
$response->cache(filemtime($assetFile));
$response->send();
ob_clean();
// instead of the possible `include()` in the original
// methods source, use `readfile()` only
readfile($assetFile);
if ($compressionEnabled) {
ob_end_flush();
}
}
}
// app/Config/bootstrap.php
Configure::write('Dispatcher.filters', array(
'MyAssetDispatcher', // instead of AssetDispatcher
// ...
));
另请参阅 http://book.cakephp.org/2.0/en/development/dispatch-filters.html
我只是在这里猜测,但是它在你的其他服务器上工作的原因可能是short open tags(即<?
)禁用了。但是,即使这是您的新服务器上的问题,这不是您应该依赖的东西,资产仍然使用include()
提供,您很可能不想检查所有你的第三方CSS / JS可以在每次更新时注入可能的PHP代码。