2017-08-12 2 views
3

[Sat Aug 12 02:21:28.993810 2017] [php7:notice] [pid 20352 ] [クライアント:14302] PHPのお知らせ:ライン1534PHP Notice:/var/www/zephyr/library/XenForo/Application.phpの1534行で見つからない数値です。

/** 
* Gets the current memory limit. 
* 
* @return int 
*/ 
public static function getMemoryLimit() 
{ 
    if (self::$_memoryLimit === null) 
    { 
     $curLimit = @ini_get('memory_limit'); 
     if ($curLimit === false) 
     { 
      // reading failed, so we have to treat it as unlimited - unlikely to be able to change anyway 
      $curLimit = -1; 
     } 
     else 
     { 
      switch (substr($curLimit, -1)) 
      { 
       case 'g': 
       case 'G': 
        $curLimit *= 1024; //This is line 1534 
        // fall through 

       case 'm': 
       case 'M': 
        $curLimit *= 1024; 
        // fall through 

       case 'k': 
       case 'K': 
        $curLimit *= 1024; 
      } 
     } 

     self::$_memoryLimit = intval($curLimit); 
    } 

    return self::$_memoryLimit; 
} 

ない、このいずれかを修正する方法をかなり確実に/var/www/zephyr/library/XenForo/Application.phpに遭遇した非うまく形成された数値、 1534

+2

私の推測ではあるが$ curLimit = @ini_get( 'のmemory_limit'); 1Mのようなものに設定されています。それで$ curLimitが何であるかを確認してください。 – Gordon

+0

'var_dump($ curLimit)' –

答えて

0

$curLimit *= 1024;の整数を文字列に乗算しています。 $curLimitと等しい(たとえば)512Mです。あなたの$curLimithttp://php.net/manual/en/ini.core.php#ini.memory-limitを引用

$curLimit = @ini_get('memory_limit'); 

から来

$curLimitNumber = substr($curLimit, 0, -1);//Will extract the number (512 FROM 512M) 
switch (substr($curLimit, -1)) 
     { 
      case 'g': 
      case 'G': 
       $curLimitNumber *= 1024; 
+0

皆さん、ありがとうございます。問題を修正しましたが、apache2はphp5とphp7を同時にロードしようとしていましたが、この問題を解決するためにphp5をアンロードしました。 –

+0

@ItsDeziあなたはこれを取得しませんでしたApacheのための通知。今あなたは障害の通知だけです。または、あなたのphp7.iniはmemory_limitの略記を使用していません – Gordon

0

整数を使用する場合は、値があるので、何をしなければならないことは、最後の文字を削除ですバイト単位で測定されます。このFAQに記載されている簡略表記法も使用できます。

とドキュメントに記載さthat FAQを引用:

利用可能なオプションは、(キロバイト)K(メガバイト)MおよびGである(ギガバイトのため、PHP 5.1.0以降で利用可能)、およびすべて大文字小文字を区別しません。他のものはバイトを仮定します。 1Mは1メガバイトまたは1048576バイトに相当します。 1Kは1キロバイトまたは1024バイトに等しい。これらの簡略表記は、php.iniとini_set()関数で使用できます。

あなたが表示されたコードはmemory_limitから取ら$curLimit値の最後の文字をチェックされています

switch (substr($curLimit, -1)) 

このことは、それがすでに短縮表記を予想しています。 caseブロックでは、k、g、mなどをチェックしています(略記)。$curLimitを実際のバイトに展開します。

あなたは

$value = "1M"; 
$value *= 1024; 

を行うと、結果は1024になりますが、「1M」は十分に形成された数値が、単なる文字列ではありませんので、あなたは、あなたが得るお知らせを取得します。この場合のPHPの動作は、type juggleの最初の数字以外の文字までの数字です。それは "1M"を整数1として扱います。したがって、コードはうまくいくでしょうが、それはうっかりです。したがって通知。

通知を取り除きたい場合は、$curLimitから省略名を削除するか、$curLimitをintにキャストするか、intvalに渡してから掛けてください。

XenForoフォーラムでこの程度のバグレポートがあります:

+0

皆さん、ありがとうございましたが、問題を修正しました.apache2はphp5とphp7を同時にロードしようとしていましたが、 –

関連する問題