2016-07-06 12 views
8

Introphp7 oauth illegal Speicherzuordnung

Während in einem komplexen Webanwendung läuft, wird ein Prozess versucht, hervorgebracht php7 illegal Speichermenge (18446744069414584466 Bytes) zuzuordnen, wenn die oauth Modul. Nach fpm Manager starten Sie den Fehler erscheint nach 2-5 mal dieser Code ausgelöst wird:

Nachricht
$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); 

Fehler

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

Beschreibung

Die betroffene Zeile in der Fehlermeldung erwähnt ist die holen Methode des oauth Client:

Ich habe versucht, den zugehörigen Code zu isolieren, indem ich ihn in einer Schleife ausfühle und die Speicherauslastung im Laufe der Zeit beobachte. Die Menge der verwendeten und zugewiesenen Speicher scheint im Laufe der Zeit stetig zu wachsen, aber nicht so schnell wie erwartet (wahrscheinlich ist es nur die oauthClient Caching Antworten)

Standalone

-Code

<?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, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_AUTHORIZATION); 
$oauthClient->disableSSLChecks(); 
$oauthClient->setToken($token, $tokenSecret); 

do { 
     $oauthClient->fetch($callUrl, $strPostData, $method, $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); 
?> 

Ausgabe

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 
... 

Kern & Module Versionen

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 
+0

Haben Sie etwas herausgefunden? Ich habe das gleiche Problem mit pecl oauth und PHP 7.0.4-7ubuntu2.1 (auf Ubuntu 16.04). lächerlich hohe Speicherzuweisung: Erlaubte Speichergröße von 134217728 Bytes erschöpft (versucht, 18446744069414591624 Bytes zuzuweisen) –

+0

Ich werde auch hinzufügen, dass ich dies mit Apache erfahre, und wenn ich die Datei nach dem Neustart des Servers erneut speichern, funktioniert der Code normalerweise in Ordnung. –

+0

nein, leider nicht, wir mussten stattdessen auf php5.6 downgraden und wenn ich mir die Anzahl der Fehler ansehe, die in den Grundfunktionen gefunden und behoben wurden (http://php.net/ChangeLog-7.php#) 7.0.7), ich denke nicht, dass es wirklich in der Produktion verwendet werden kann, zB: Integer Overflow in json_encode()/json_decode()/json_utf8_to_utf16(), Integer Overflow in nl2br() –

Antwort

4

traf ich ein ähnliches Problem und verfolgt sie mit der Verwendung der oauth Erweiterung zu einem Problem nach unten mit opcache aktiviert. Es gibt tatsächlich einen Fehler, der für PHP offen ist, um die genaue Situation zu erfahren, in der ich gerade war - https://bugs.php.net/bug.php?id=73310. Wir haben eine mögliche Problemumgehung für dieses Problem gefunden, bis es vollständig gelöst ist. Durch die schwarze Liste der Dateien, die die oauth-Erweiterung für Opcache nutzen, wird die Ausnahme beseitigt.

Sie können Dateien für Opcache mithilfe der Option opcache.blacklist-filename - http://php.net/manual/en/opcache.configuration.php#ini.opcache.blacklist-filename - in die Blacklist aufnehmen.

  • eine txt-Datei auf dem Server mit dem vollständigen Pfad jeder Datei hinzufügen Sie mögen, auf seiner eigenen Linie
  • öffnet opcache.ini im Bearbeitungsmodus (zB sudo vi schwarze Liste /etc/php/7.0/ mods-available/opcache.ini)
  • Bearbeiten Sie den Opcache.schwarze Liste-Dateinamen Option auf die txt-Datei zeigen Sie mit den schwarzen Liste von Dateien erstellt
  • Wenn Sie fpm verwenden, starten Sie es
0

Wie aus dem Nichts, das war für mich wie Charme

$this->oauth->fetch($endpoint, [], 'GET', ['Accept' => 'application/json']); 

wird

$this->oauth->fetch($endpoint, ['fix'], 'GET', ['Accept' => 'application/json']); 

Ja, nur den zweiten Parameter füllen und es nicht leer verlassen.