php memcached 扩展 timeout 问题

 更新时间:2016年11月25日 17:38  点击:1563

php 中使用memcached扩展来访问memcached时,当memcached服务器无法正常连接,在默认设置下会造成请求响应变慢。注意:无法正常连接指网络故障,如两台服务器无法进行通信等,只要能ping通,就算memcached服务没有开启或down掉,不会影响响应时间,只是memcached没有启作用。

设置timeout时间通过常量Memcached::OPT_CONNECT_TIMEOUT来控制,默认是4000毫秒(php 官网显示1000,我测试版本1.0.2和2.0.1都是4000)。另外1.0.2和2.0.1还有很大差别。1.0.2在执行addServer时就会连接memcached服务器,而且执行命令时候需要2倍的timeout时间,所有当memcached无法连接时候,花费时间是3倍的timeout时间。

2.0.1在php 5.2中似乎有bug,无法使用,具体参看:https://bugs.php.net/bug.php?id=61283。

本文章来给大家介绍Strict Standards: Only variables should be passed by reference in解决办法,各位朋友可参考。

php中使用内置的reset函数可以获取array的第一个元素的值。例如:

 代码如下 复制代码

$arr = array('one', 'two', 'three');

echo reset($arr);  

// 输出的结果为 one对于下述代码,如果php开启了"Strict Standards",将会看到"Strict Standards: Only variables should be passed by reference in"的提示。

 代码如下 复制代码

$str = 'netingcn.com';

echo reset(explode('.', $str));

为什么会这样呢?可以先看看reset函数的定义:

function reset (array &$array) {}从定义中可以看到,reset接受的参数是一个array的引用。而上述代码中explode返回值不是任何array的引用,所以在"Strict Standards"下会有上述提示。解决办法很简单,只需要把reset(explode('.', $str))分两步写即可。第一步先把explode的返回值赋给一个变量,第二步把这个变量作为reset参数。

出现上面的提示的不只是reset函数,只要参数接受的是对象引用,而传值直接使用function返回值都会看到那样的提示。例如内置的array_pop、shuffle、curent、next、prev、next等等

本文章来给各位同学介绍Windows 平台的 PHP 报错 Fatal error: Class \'COM\' not found in 的解决方法,有需要了解的朋友可参考。


然在 Win Server 08 往上搭载的 IIS 跑 php 性能提升不少,但还是觉得不太舒服。。。

某日在调试一个win上的php生产环境时,一段php代码返回了错误:

Fatal error: Class 'COM' not found in XXXXXXXXX
1 Fatal error: Class 'COM' not found in XXXXXXXXX

没发现 COM 类,php代码主要是调用一些系统的信息,初想应该是php没配置好,在stackoverflow找到答案,是讨论xampp的,要延伸开来,我加了几个要点:

★ php 根目录的 ext 文件夹下确保存有 php_com_dotnet.dll 这个文件

★ php.ini 确保有此语句

[PHP_COM_DOTNET]
extension=php_com_dotnet.dll
1
2 [PHP_COM_DOTNET]extension=php_com_dotnet.dll

★ 开始 > 运行 > services.msc 回车 > 确保 COM+ Event System 的服务开启

在 PHP 5.4.5 版本之前是内置的,但往后版本中分离了。。。

今天在使用phpwind9.0时发现安装它时居然需要安装pdo_mysql这个组件了,这个个人认为是一个脑残的做法,现在有多少站长是空间怎么可能权限来修改php.ini配置呢,为phpwind团队做出这样的做法感觉无奈

下面我来介绍一些办法,这些都是有服务器操作权限的朋友可参考下面办法。

常见错误:
1.pdo_mysql未安装

解决方法:

修改本地php.ini配置,以Win下的php为例,

找到

 代码如下 复制代码

;extension=php_pdo_mysql.dll
;extension=php_pdo.dll

修改成

;extension=php_pdo_mysql.dll
;extension=php_pdo.dll

去除前面的分号“;”。重启apache服务即可。

linux服务器处理办法

lanmp可以试着改一下php.ini

 代码如下 复制代码

extension_dir = /www/wdlinux/apache_php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/
extension=pdo.so
extension=pdo_mysql.so

测试后发现无效!

开始重新pdo_mysql的安装,需要用Xshell一类的软件登陆服务器进行设置

步骤:

1. cd lanmp //移动到安装包目录下
  2. tar zxvf PDO_MYSQL-1.0.2.tgz //解压安装包
  3. cd PDO_MYSQL-1.0.2 //进入解压后安装目录
  4. /www/wdlinux/php/bin/phpize //查询环境版本
  5. ./configure –with-php-config=/www/wdlinux/php/bin/php-config –with-pdo-mysql=/www/wdlinux/mysql //编译前测试配置
  6. make //编译安装包
  7. make install //安装
  安装后重启:service httpd restart   和  service nginxd restart
  然后再次安装phpwind9.0即可解决问题!
  此方法可以解决:wdcp环境VPS,阿里云服务器的配置中出现pdo_mysql未安装和数据库连接失败could not find driver的问题!

本文章来给大家介绍cURL函数库错误码说明之PHP curl_errno函数,有需要了解的朋友不防进入参考。

背景概述:
游戏接口是使用PHP cURL扩展进行请求操作。但是,被请求的服务器经常会无故的不响应或者超时。总之,就是请求之后收不到响应回来的数据。这时候可不能说对方API接口有问题,或者,服务器有故障。总之,可能出现的问题是非常之多。不能一概而论。

一、给出一段常用的PHP cURL代码:

 代码如下 复制代码

function sendRequestGame($url)
{
    $header = array('Expect:');
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    $retData = curl_exec( $ch );
    curl_close( $ch );

    return $retData;
}

经常使用PHP cURL函数的人,一定不会陌生吧。

同时,我也相信大部分PHPer也是这样写代码的。至少核心部分就是这样,根本没有判断这个请求失败了,是什么情况产生的。

诚然,通过严重的安全事故导致我必须重新审核这个cURL库,该怎样保证我的请求是稳定可靠的。当出现失败之后,我要知道是什么原因导致的。第一时间知道并反馈到人,进行及时的沟通协调与修复。

现在我们为了保证每次请求的稳定可靠性,必须加入日志功能。即把失败时请求的相关参数状态和错误码一起记录到日志中。方便,我们失败之后去检查。

看代码:

 代码如下 复制代码

function sendRequestGame($url)
{
    $header = array('Expect:');
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_TIMEOUT, 2);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
 $return  = curl_exec( $ch );
 $errno = curl_errno( $ch );
 $info  = curl_getinfo( $ch );
 $info['errno'] = $errno;
    curl_close( $ch );

 $log = json_encode( $info );
 putLog( $log );

    return $return;
}

/**
 * 打日志。
 * @param string $log 日志内容。
 * @return void
 */
function putLog( $log )
{
 $log .= "nn";
 $logDir = dirname( __FILE__ );
 $logPath = $logDir . "/curl_log.txt";
 if ( !file_exists( $logPath ) )
 {
  $handle = fopen( $logPath, 'w' );
  fclose ( $handle );
 }
 file_put_contents( $logPath, $log, FILE_APPEND );
}

现在调用 sendRequestGame 函数的时候,会将每次请求的信息给json_encode之后保存到日志文件 curl_log.txt中。这样,我们就可以清楚地知道,每次请求到底发生了什么情况。

改进之后,增加了两个函数:

$errno = curl_errno( $ch );
$info  = curl_getinfo( $ch );这两个函数非常的关键。第一个 curl_errno是返回当前请求的错误码,0代表没有错误,是一个Ok正常的请求。非0代码请求出现了错误。但是,大部分错误发生时,请求都没有正确到达URL所指定的服务器。如:主机打不到、网址错误、404。当然,不排除有500这种内部服务器错误的存在。

第二个是函数非常重要,curl_getinfo函数会获取当前请求的相关信息:

 代码如下 复制代码

Array
(
    [url] => http://www.111cn.net/
    [content_type] => text/html; charset=UTF-8
    [http_code] => 200
    [header_size] => 321
    [request_size] => 53
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 2.075
    [namelookup_time] => 0
    [connect_time] => 0.031
    [pretransfer_time] => 0.031
    [size_upload] => 0
    [size_download] => 79042
    [speed_download] => 38092
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => 0
    [starttransfer_time] => 1.388
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [redirect_url] =>

我相信大家人字面意思就能看懂7788.不明白的话,自己去看PHP官方手册吧。

以下,我再附上 curl error code ,即 curl_errno函数返回的数字说明:
CURLE_UNSUPPORTED_PROTOCOL (1) – 您传送给 libcurl 的网址使用了此 libcurl 不支持的协议。 可能是您没有使用的编译时选项造成了这种情况(可能是协议字符串拼写有误,或没有指定协议 libcurl 代码)。
CURLE_FAILED_INIT (2) – 非常早期的初始化代码失败。 可能是内部错误或问题。
CURLE_URL_MALFORMAT (3) – 网址格式不正确。
CURLE_COULDNT_RESOLVE_PROXY (5) – 无法解析代理服务器。 指定的代理服务器主机无法解析。
CURLE_COULDNT_RESOLVE_HOST (6) – 无法解析主机。 指定的远程主机无法解析。
CURLE_COULDNT_CONNECT (7) – 无法通过 connect() 连接至主机或代理服务器。
CURLE_FTP_WEIRD_SERVER_REPLY (8) – 在连接到 FTP 服务器后,libcurl 需要收到特定的回复。 此错误代码表示收到了不正常或不正确的回复。 指定的远程服务器可能不是正确的 FTP 服务器。
CURLE_REMOTE_ACCESS_DENIED (9) – 我们无法访问网址中指定的资源。 对于 FTP,如果尝试更改为远程目录,就会发生这种情况。
CURLE_FTP_WEIRD_PASS_REPLY (11) – 在将 FTP 密码发送到服务器后,libcurl 需要收到正确的回复。 此错误代码表示返回的是意外的代码。
CURLE_FTP_WEIRD_PASV_REPLY (13) – libcurl 无法从服务器端收到有用的结果,作为对 PASV 或 EPSV 命令的响应。 服务器有问题。
CURLE_FTP_WEIRD_227_FORMAT (14) – FTP 服务器返回 227 行作为对 PASV 命令的响应。如果 libcurl 无法解析此行,就会返回此代码。
CURLE_FTP_CANT_GET_HOST (15) – 在查找用于新连接的主机时出现内部错误。
CURLE_FTP_COULDNT_SET_TYPE (17) – 在尝试将传输模式设置为二进制或 ascii 时发生错误。
CURLE_PARTIAL_FILE (18) – 文件传输尺寸小于或大于预期。当服务器先报告了一个预期的传输尺寸,然后所传送的数据与先前指定尺寸不相符时,就会发生此错误。
CURLE_FTP_COULDNT_RETR_FILE (19) – ‘RETR’ 命令收到了不正常的回复,或完成的传输尺寸为零字节。
CURLE_QUOTE_ERROR (21) – 在向远程服务器发送自定义 “QUOTE” 命令时,其中一个命令返回的错误代码为 400 或更大的数字(对于 FTP),或以其他方式表明命令无法成功完成。
CURLE_HTTP_RETURNED_ERROR (22) – 如果 CURLOPT_FAILONERROR 设置为 TRUE,且 HTTP 服务器返回 >= 400 的错误代码,就会返回此代码。 (此错误代码以前又称为 CURLE_HTTP_NOT_FOUND。)
CURLE_WRITE_ERROR (23) – 在向本地文件写入所收到的数据时发生错误,或由写入回调 (write callback) 向 libcurl 返回了一个错误。
CURLE_UPLOAD_FAILED (25) – 无法开始上传。 对于 FTP,服务器通常会拒绝执行 STOR 命令。错误缓冲区通常会提供服务器对此问题的说明。 (此错误代码以前又称为 CURLE_FTP_COULDNT_STOR_FILE。)
CURLE_READ_ERROR (26) – 读取本地文件时遇到问题,或由读取回调 (read callback) 返回了一个错误。
CURLE_OUT_OF_MEMORY (27) – 内存分配请求失败。此错误比较严重,若发生此错误,则表明出现了非常严重的问题。
CURLE_OPERATION_TIMEDOUT (28) – 操作超时。 已达到根据相应情况指定的超时时间。 请注意: 自 Urchin 6.6.0.2 开始,超时时间可以自行更改。 要指定远程日志下载超时,请打开 urchin.conf 文件,取消以下行的注释标记:
#DownloadTimeout: 30
CURLE_FTP_PORT_FAILED (30) – FTP PORT 命令返回错误。 在没有为 libcurl 指定适当的地址使用时,最有可能发生此问题。 请参阅 CURLOPT_FTPPORT。
CURLE_FTP_COULDNT_USE_REST (31) – FTP REST 命令返回错误。如果服务器正常,则应当不会发生这种情况。
CURLE_RANGE_ERROR (33) – 服务器不支持或不接受范围请求。
CURLE_HTTP_POST_ERROR (34) – 此问题比较少见,主要由内部混乱引发。
CURLE_SSL_CONNECT_ERROR (35) – 同时使用 SSL/TLS 时可能会发生此错误。您可以访问错误缓冲区查看相应信息,其中会对此问题进行更详细的介绍。可能是证书(文件格式、路径、许可)、密码及其他因素导致了此问题。
CURLE_FTP_BAD_DOWNLOAD_RESUME (36) – 尝试恢复超过文件大小限制的 FTP 连接。
CURLE_FILE_COULDNT_READ_FILE (37) – 无法打开 FILE:// 路径下的文件。原因很可能是文件路径无法识别现有文件。 建议您检查文件的访问权限。
CURLE_LDAP_CANNOT_BIND (38) – LDAP 无法绑定。LDAP 绑定操作失败。
CURLE_LDAP_SEARCH_FAILED (39) – LDAP 搜索无法进行。
CURLE_FUNCTION_NOT_FOUND (41) – 找不到函数。 找不到必要的 zlib 函数。
CURLE_ABORTED_BY_CALLBACK (42) – 由回调中止。 回调向 libcurl 返回了 “abort”。
CURLE_BAD_FUNCTION_ARGUMENT (43) – 内部错误。 使用了不正确的参数调用函数。
CURLE_INTERFACE_FAILED (45) – 界面错误。 指定的外部界面无法使用。 请通过 CURLOPT_INTERFACE 设置要使用哪个界面来处理外部连接的来源 IP 地址。 (此错误代码以前又称为 CURLE_HTTP_PORT_FAILED。)
CURLE_TOO_MANY_REDIRECTS (47) – 重定向过多。 进行重定向时,libcurl 达到了网页点击上限。请使用 CURLOPT_MAXREDIRS 设置上限。
CURLE_UNKNOWN_TELNET_OPTION (48) – 无法识别以 CURLOPT_TELNETOPTIONS 设置的选项。 请参阅相关文档。
CURLE_TELNET_OPTION_SYNTAX (49) – telnet 选项字符串的格式不正确。
CURLE_PEER_FAILED_VERIFICATION (51) – 远程服务器的 SSL 证书或 SSH md5 指纹不正确。
CURLE_GOT_NOTHING (52) – 服务器未返回任何数据,在相应情况下,未返回任何数据就属于出现错误。
CURLE_SSL_ENGINE_NOTFOUND (53) – 找不到指定的加密引擎。
CURLE_SSL_ENGINE_SETFAILED (54) – 无法将选定的 SSL 加密引擎设为默认选项。
CURLE_SEND_ERROR (55) – 无法发送网络数据。
CURLE_RECV_ERROR (56) – 接收网络数据失败。
CURLE_SSL_CERTPROBLEM (58) – 本地客户端证书有问题
CURLE_SSL_CIPHER (59) – 无法使用指定的密钥
CURLE_SSL_CACERT (60) – 无法使用已知的 CA 证书验证对等证书
CURLE_BAD_CONTENT_ENCODING (61) – 无法识别传输编码
CURLE_LDAP_INVALID_URL (62) – LDAP 网址无效
CURLE_FILESIZE_EXCEEDED (63) – 超过了文件大小上限
CURLE_USE_SSL_FAILED (64) – 请求的 FTP SSL 级别失败
CURLE_SEND_FAIL_REWIND (65) – 进行发送操作时,curl 必须回转数据以便重新传输,但回转操作未能成功
CURLE_SSL_ENGINE_INITFAILED (66) – SSL 引擎初始化失败
CURLE_LOGIN_DENIED (67) – 远程服务器拒绝 curl 登录(7.13.1 新增功能)
CURLE_TFTP_NOTFOUND (68) – 在 TFTP 服务器上找不到文件
CURLE_TFTP_PERM (69) – 在 TFTP 服务器上遇到权限问题
CURLE_REMOTE_DISK_FULL (70) – 服务器磁盘空间不足
CURLE_TFTP_ILLEGAL (71) – TFTP 操作非法
CURLE_TFTP_UNKNOWNID (72) – TFTP 传输 ID 未知
CURLE_REMOTE_FILE_EXISTS (73) – 文件已存在,无法覆盖
CURLE_TFTP_NOSUCHUSER (74) – 运行正常的 TFTP 服务器不会返回此错误
CURLE_CONV_FAILED (75) – 字符转换失败
CURLE_CONV_REQD (76) – 调用方必须注册转换回调
CURLE_SSL_CACERT_BADFILE (77) – 读取 SSL CA 证书时遇到问题(可能是路径错误或访问权限问题)
CURLE_REMOTE_FILE_NOT_FOUND (78) – 网址中引用的资源不存在
CURLE_SSH (79) – SSH 会话中发生无法识别的错误
CURLE_SSL_SHUTDOWN_FAILED (80) – 无法终止 SSL 连接

[!--infotagslink--]

相关文章

  • PHP分布式框架如何使用Memcache同步SESSION教程

    本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25
  • JavaScript学习笔记整理_setTimeout的应用

    下面小编就为大家带来一篇JavaScript学习笔记整理_setTimeout的应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-03
  • 解决ORA-12170:TNS connect timeout occurred问题

    这篇文章主要介绍了解决ORA-12170:TNS connect timeout occurred问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • PHP+memcache实现消息队列案例分享

    memche消息队列的原理就是在key上做文章,用以做一个连续的数字加上前缀记录序列化以后消息或者日志。然后通过定时程序将内容落地到文件或者数据库。php实现消息队列的用处比如在做发送邮件时发送大量邮件很费时间的问...2014-05-31
  • vue 解决setTimeOut和setInterval函数无效报错的问题

    这篇文章主要介绍了vue 解决setTimeOut和setInterval函数无效报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30
  • Windows下Memcache的安装方法

    很多phper不知道如何在Windows下搭建Memcache的开发调试环境,最近个人也在研究Memcache,记录下自己安装搭建的过程。 ...2016-01-27
  • 在Mac OS的PHP环境下安装配置MemCache的全过程解析

    这篇文章主要介绍了在Mac OS的PHP环境下安装配置MemCache的全过程解析,MemCache是一套分布式的高速缓存系统,需要的朋友可以参考下...2016-02-18
  • 详解AngularJS脏检查机制及$timeout的妙用

    本篇文章主要介绍了详解AngularJS脏检查机制及$timeout的妙用,“脏检查”是Angular中的核心机制之一,它是实现双向绑定、MVVM模式的重要基础,有兴趣的可以了解一下 ...2017-06-24
  • php memcache和php memcached比较以及问题

    php memcache和php memcached是php的memcache分布式的高速缓存系统的两个客户端,php memcache是老客户端,php memcached是功能更加完善的新的代替php memcached的。...2016-11-25
  • PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )

    这篇文章主要介绍了PHP中eAccelerator、memcached、xcache、APC 4个加速、缓存扩展的区别的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-07-25
  • php memcache和memcached模块安装应用

    memcache的官方主页:php教程.net/package/memcache">http://pecl.php.net/package/memcache memcached的官方主页:http://pecl.php.net/package/memcached 以下是我安装...2016-11-25
  • JS中setTimeout和setInterval的最大延时值详解

    这篇文章主要介绍了JS中setTimeout和setInterval的最大延时值的相关资料,文中通过示例代码介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。...2017-02-19
  • Memcached 入门代码实例

    代码如下 复制代码 <?php教程 class mycache { private $cache; function __construct() { $this->cache = new memcache();...2016-11-25
  • PHP MemCached 缓存应用

     Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱...2016-11-25
  • 理解javascript定时器中的setTimeout与setInterval

    这篇文章主要帮助大家学习理解javascript定时器中的setTimeout与setInterval,从实例出发进行深入探讨,感兴趣的小伙伴们可以参考一下...2016-02-26
  • BOM系列第一篇之定时器setTimeout和setInterval

    这篇文章主要介绍了BOM系列第一篇之定时器setTimeout和setInterval 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-08-24
  • 解决memcache中使用session_start启动慢

    session_start启动慢是自己的机器使用了memcache来缓存session了,这样发现用户登录之后mysql查询超级慢了,下面我来介绍一个临时的解决办法。 下面是我们的测试页...2016-11-25
  • memcached的安装、配置等基本命令

    memcached是一个超高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载了,现在我们就来看看如何配置memcached吧,希望能帮助到大家。 memcached的基本...2016-11-25
  • Windows下Memcache的安装及PHP扩展配置方法

    这篇文章主要介绍了Windows下Memcache的安装及PHP扩展配置方法,需要的朋友可以参考下...2016-01-27
  • Memcached 应用与分析(1/9)

    ◎Memcached是什么 在阐述这个问题之前,我们首先要清楚它“不是什么”。很多人把它当作和SharedMemory那种形式的存储载体来使用,虽然memcached 使用了同样的&...2016-11-25