重新使用经过身份验证的HTTP连接或cURL句柄

时间:2013-01-16 作者:Simon Gibbs

我们有一个定制的Wordpress插件,它在编辑贴子页面中添加了一个元框。该插件从半私有HTTP REST API访问数据。

连接经过身份验证(摘要)并定期访问-每个写帖子的人都会与它进行多次互动(通常是密集爆发),这样的人超过100人。因此,我们希望确保HTTP调用有效地工作。我们看到两个问题:

没有证据表明Keep-Alive被用来阻止TCP套接字不断打开和关闭pre-emptive authentication.当用户与元框交互时,我们可以在元框中看到延迟,因此这是一个真正的问题。

我听说其中一些问题可以通过重新使用cURL句柄来解决,但找不到任何关于在WordPress插件中实现这一点的最佳实践建议。我们面临的一个问题是,据我们所知,WordPRess会根据每个请求有效地重新初始化插件。

2 个回复
最合适的回答,由SO网友:Simon Gibbs 整理而成

由于PHP在web环境(mod\\u PHP)中的基本限制,至少在合理范围内,不可能解决这两个问题中的任何一个。

类变量不会在web请求之间持久存在,因此问题的保持活动部分无法修复,因为所有资源(即curl句柄、tcp套接字)都将在请求结束时销毁。重用cUrl句柄似乎主要与批处理脚本或罕见的需要一次性访问多个URL的web脚本有关。那种performance optimizations considered standard 因此,PHP开发人员无法使用for Java开发人员。

可以尝试通过将授权标头的值粘贴到会话中来实现摘要身份验证,但实现起来并不便宜(开发时间很长),而且许多企业都不想花时间来实现这一点。例如,这可能是一个不错的大学三年级项目。

希望在某个时候,有人会在Apache中发布一个PHP附加产品,以某种方式将HTTP请求传递到进程外部的TCP连接池。这可能会赚钱,因为它会减少来自PHP的上游HTTP请求的大量延迟。

SO网友:kaiser

检查cURL请求

即使检查和调试cURL请求不是WordPress独有的事情,您也需要了解WP-HTTP-API内部的大部分内容才能绕过它。我已经为自己编写了一个插件来实现这一点,我已经对其进行了修改/剥离并附加给您使用。它将在关闭挂钩中输出cURL对象的详细信息,无论是在管理UI中还是在前端/主题中。

你能做的就是使用完全相同的钩子http_api_curl 并捕捉cURL对象。然后将其保存到类变量中,将下一个调用附加到该类变量,然后继续。我自己以前没有做过这样的事情,但这应该是可行的。

编辑

由于此处的编辑数量有限,我将此插件的进一步开发移至GitHub account. 如果您有注释、意见或建议,请在此处留言。

下面的插件功能齐全。GitHub上还有一个更高级的版本。

<?php
/** 
 * Plugin Name: (#81791) Dump cURL Request & Response 
 * Author:      Franz Josef Kaiser
 */
add_action( \'plugins_loaded\', array( \'WPSE81791_cURL\', \'init\' ) );
class WPSE81791_cURL
{
    protected static $instance;

    public static $dump;

    public static function init()
    {
        null === self :: $instance AND self :: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        add_action( \'http_api_curl\', array( $this, \'dump_curl\' ) );
        add_action( \'shutdown\', array( $this, \'do_dump\' ) );
    }

    /**
     * Debug the response in the middle.
     * Catches the cURL object during the request.
     * @param  cURL $handle
     * @return void
     */
    public function dump_curl( &$handle )
    {
        curl_setopt( $handle, CURLINFO_HEADER_OUT, 1 );
        curl_setopt( $handle, CURLOPT_HEADER, 0 );
        curl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( $this, \'dump_curl_buffer_cb\' ) );
        curl_setopt( $handle, CURLOPT_WRITEFUNCTION, array( $this, \'dump_curl_buffer_cb\' ) );
        curl_exec( $handle );
        $this->add_dump(
             curl_getinfo( $handle, CURLINFO_HEADER_OUT )
            .$this->dump_curl_buffer_cb( null )
            .\'<br />Nr. of Errors: \'.curl_errno( $handle )
            .\'<br />Errors: \'.curl_error( $handle )
        );
    }

    /**
     * Callback for cURL dump method
     * @param  object $curl
     * @param  null   $data
     * @return int
     */
    public function dump_curl_buffer_cb( $curl, $data = null )
    {
        static $buffer = \'\';
        if ( is_null( $curl ) )
        {
            $r = $buffer;
            $buffer = \'\';
            return $r;
        }
        $buffer .= $data;
        return strlen( $data );
    }

    /**
     * Adds data to the static data stack
     * @param  
     * @return void
     */
    public function add_dump( $data )
    {
        self :: $dump[] = $data;
    }

    /**
     * Dumps the data stack for debug
     * @param  
     * @return void
     */
    public function do_dump()
    {
        printf(
             \'<pre>%s</pre>\'
            ,var_export( implode( "<br />", self :: $dump ), true ) 
        );
    }
}

结束

相关推荐

curl problem or permalinks

我刚刚配置了我的VPS,我使用的是Centos,一切都很好,但如果我将永久链接设置为自定义结构,然后接受主页,没有帖子出现,它会显示404页,我想这是因为我没有启用curl,但我不知道我的php在哪里。我的centos中的ini文件?好的,我的卷曲被启用了,我检查过了phpinfo(); 这里是URLhttp://74.117.158.182/info.php但如果我在我的wordpress中设置了永久链接,那么接受主页,所有都会给我404页,你可以在这个URL上查看http://mbas.co.in如果