oauth-2.0 – php7 oauth非法内存分配

介绍

在复杂的Web应用程序中运行时,生成PHP7进程尝试在使用oauth模块时分配非法内存量(18446744069414584466字节). fpm管理器重新启动后,在触发此代码2-5次后出现错误

$oauthClient = new \OAuth($consumerKey,$consumerSecret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_AUTHORIZATION);
$oauthClient->disableSSLChecks();
$oauthClient->setToken($token,$tokenSecret);
$oauthClient->fetch($callUrl,$strPostData,$method,$headers);

错误信息

*20 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 18446744069414584466 bytes)

描述

错误消息中提到的受影响的行是oauth客户端的fetch方法

$oauthClient->fetch($callUrl,$headers);

我试图通过在循环中执行它并随着时间观察内存使用情况来隔离相关代码.使用和分配的内存量似乎随着时间的推移而稳定增长,但没有预期的那么快(可能只是oauthClient缓存响应)

独立

<?PHP

$strPostData = '';
$method = 'GET';
$consumerKey = '<consumerKey>';
$consumerSecret = '<consumerSecret>';
$token = '<token>';
$tokenSecret = '<tokenSecret>';
$url = '<url>';

$headers = array('accept' => 'application/json');
$callUrl = $url;

if ($method === 'POST' || $method === 'PUT') {
    $headers['Content-Type'] = 'application/json';
}

$oauthClient = new \OAuth($consumerKey,$tokenSecret);

do {
        $oauthClient->fetch($callUrl,$headers);
        $response = $oauthClient->getLastResponse();
        fwrite(STDOUT,'Allocated Memory: '. memory_get_usage(false) . PHP_EOL);
        fwrite(STDOUT,'Used Memory: '. memory_get_usage(true) . PHP_EOL);
} while (true);
?>

产量

Allocated Memory: 236920
Used Memory: 262144
...
Allocated Memory: 263168
Used Memory: 524288
...
Allocated Memory: 289504
Used Memory: 524288
...
Used Memory: 524288
Allocated Memory: 331888
...
Allocated Memory: 395976
Used Memory: 524288
...
Allocated Memory: 428600
Used Memory: 524288
...

核心&模块版本

Core: 7.0.8-3+deb.sury.org~trusty+1
date: 7.0.8-3+deb.sury.org~trusty+1
libxml: 7.0.8-3+deb.sury.org~trusty+1
openssl: 7.0.8-3+deb.sury.org~trusty+1
pcre: 7.0.8-3+deb.sury.org~trusty+1
zlib: 7.0.8-3+deb.sury.org~trusty+1
filter: 7.0.8-3+deb.sury.org~trusty+1
hash: 1.0
pcntl: 7.0.8-3+deb.sury.org~trusty+1
Reflection: 7.0.8-3+deb.sury.org~trusty+1
SPL: 7.0.8-3+deb.sury.org~trusty+1
session: 7.0.8-3+deb.sury.org~trusty+1
standard: 7.0.8-3+deb.sury.org~trusty+1
MysqLnd: MysqLnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $
PDO: 7.0.8-3+deb.sury.org~trusty+1
xml: 7.0.8-3+deb.sury.org~trusty+1
bcmath: 7.0.8-3+deb.sury.org~trusty+1
calendar: 7.0.8-3+deb.sury.org~trusty+1
ctype: 7.0.8-3+deb.sury.org~trusty+1
curl: 7.0.8-3+deb.sury.org~trusty+1
dom: 20031129
mbstring: 7.0.8-3+deb.sury.org~trusty+1
fileinfo: 1.0.5
ftp: 7.0.8-3+deb.sury.org~trusty+1
gd: 7.0.8-3+deb.sury.org~trusty+1
gettext: 7.0.8-3+deb.sury.org~trusty+1
iconv: 7.0.8-3+deb.sury.org~trusty+1
json: 1.4.0
exif: 1.4 $Id: 8bdc0c8f27c2c9dd1f7551f1f9fe3ab57a06a4b1 $
MysqLi: 7.0.8-3+deb.sury.org~trusty+1
OAuth: 2.0.2
pdo_MysqL: 7.0.8-3+deb.sury.org~trusty+1
pdo_sqlite: 7.0.8-3+deb.sury.org~trusty+1
Phar: 2.0.2
posix: 7.0.8-3+deb.sury.org~trusty+1
readline: 7.0.8-3+deb.sury.org~trusty+1
shmop: 7.0.8-3+deb.sury.org~trusty+1
SimpleXML: 7.0.8-3+deb.sury.org~trusty+1
soap: 7.0.8-3+deb.sury.org~trusty+1
sockets: 7.0.8-3+deb.sury.org~trusty+1
sqlite3: 0.7-dev
ssh2: 0.13-dev
sysvmsg: 7.0.8-3+deb.sury.org~trusty+1
sysvsem: 7.0.8-3+deb.sury.org~trusty+1
sysvshm: 7.0.8-3+deb.sury.org~trusty+1
tokenizer: 7.0.8-3+deb.sury.org~trusty+1
wddx: 7.0.8-3+deb.sury.org~trusty+1
xmlreader: 7.0.8-3+deb.sury.org~trusty+1
xmlwriter: 7.0.8-3+deb.sury.org~trusty+1
xsl: 7.0.8-3+deb.sury.org~trusty+1
zip: 1.13.3
Zend OPcache: 7.0.8-3+deb.sury.org~trusty+1
我遇到了类似的问题,并将其跟踪到使用启用了opcache的oauth扩展的问题.对于我遇到的确切情况,实际上有一个bug是开放的错误https://bugs.php.net/bug.php?id=73310.我们找到了这个问题的潜在解决方法,直到它完全解决,将利用ocuth扩展的文件列入黑名单以清除异常.

您可以使用opcache.blacklist-filename选项-http://php.net/manual/en/opcache.configuration.php#ini.opcache.blacklist-filename将opcache的文件列入黑名单.

>在服务器上添加一个txt文件,其中包含您希望在其自己的行中列入黑名单的每个文件的完整路径>在编辑模式下打开opcache.ini(例如sudo vi /etc/PHP/7.0/mods-available/opcache.ini)>编辑opcache.blacklist-filename选项以指向使用列入黑名单的文件创建的txt文件>如果您使用的是fpm,请重新启动它

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...