我有一个Zend Framework 1.11.1 MVC应用程序,它将Wordpress 3.7.1安装为“public”目录下的子目录多站点网络。它使用必须使用的插件来确保只有MVC应用程序的登录用户才能访问任何博客。基本上,最早的MU插件运行ZF应用程序的引导程序来访问ZF登录状态,并将“安装后主题”挂接到一个函数,该函数检查MVC登录状态和权限数据库,然后返回以允许访问,或者重定向到MVC应用程序中的一个页面,解释为什么不允许访问博客。它实际上有点复杂(例如,如果MVC用户还没有登录的话,它会为其创建一个动态博客),但这就是它的要点。
在插件中,我可以调用get_blog_id_from_url
从请求中获取blog idf,原则上,如果没有这样的blog,它将返回0。但是如果请求的是一个不存在的博客,那么在运行任何必须使用的插件之前,我会得到一个404。我可以通过向根博客发出请求,并将站点名称信息作为GET参数传递来解决这个问题。
但我真正想做的是让MVC应用程序代码检查特定博客的存在,without actually issuing a request to wordpress. 我想我可以显式连接到wordpress数据库并查询wp\\u blogs表,但我想避免与wordpress代码“亲密接触”。但是为了能够调用get_blog_id_from_url
来自MVC的代码非常困难。
我最后尝试了这样的事情:
public function get_blog_id_for_mvc_request($blogname) {
global $wpdb;
$orig_uri = $_SERVER[\'REQUEST_URI\'];
// $_SERVER[\'REQUEST_URI\'] = PATH_CURRENT_SITE;
// but PATH_CURRENT_SITE is not yet defined, so hardwire for now
$_SERVER[\'REQUEST_URI\'] = \'/wp/\';
require_once(APPLICATION_PATH . \'/../public/wp/wp-load.php\');
$site_id = get_blog_id_from_url(DOMAIN_CURRENT_SITE, PATH_CURRENT_SITE . (strlen($blogname) ? "$blogname/" : ""));
$_SERVER[\'REQUEST_URI\'] = $orig_uri;
return $site_id;
}
修改和恢复$\\u服务器[\'REQUEST\\u URI]]让我感到很不舒服,但看看wordpress代码,似乎没有其他方法。该函数实际上在获取正确的站点id并继续使用该站点id的MVC页面方面起到了作用。但在浏览器中呈现该页面后,httpd崩溃了(Apache 2.2.14和XP上的PHP 5.3.1):
对于跟踪/修复服务器崩溃,或者以简单可靠的方式直接访问数据库,有人有什么建议吗?
最合适的回答,由SO网友:sootsnoot 整理而成
看来我可以回答我自己的问题了。
事实证明,问题不在于wordpress所做的任何事情,而在于我将其与Zend应用程序集成在一个比问题中显示的代码更高的级别上的方式。该代码本身运行良好,并没有导致Apache崩溃。
问题是,在与Zend MVC应用程序的初始集成中,我只考虑运行可以访问MVC应用程序功能和数据库的wordpress查询。要做到这一点,我的第一次运行必须使用为Zend应用程序运行引导程序的插件。但是,当我需要从Zend应用程序访问wordpress功能时,我没有阻止Zend引导程序运行两次(一次是在设置MVC请求时,另一次是在wordpress的初始必须使用插件时)。
防止Zend应用程序引导在同一请求中运行两次(使用define/defined)修复了apache崩溃,现在发布的代码可以正常工作。既然我确信我不是唯一一个将wordpress与Zend Framework MVC应用程序集成的人,我想我应该发布这个详细的答案。