2017-05-11 2 views
1

나는, PHP 5.6.30에서 작동하는 코드를 가지고 있지만 PHP는 7.0.9에 오류를 보여줍니다 : $ dat, $ offset, SEEK_CUR);fseek과는 7.0.9

PHP 5.6부터이 함수에서 변경된 사항이 있습니까?

코드 :

<?php 
/** 
* Items class 
* 
* @package MyAAC 
* @author Slawkens <[email protected]> 
* @copyright 2017 MyAAC 
* @version 0.0.6 
* @link  http://my-aac.org 
*/ 
defined('MYAAC') or die('Direct access not allowed!'); 

if (!function_exists('stackId')) 
{ 
    function stackId($count) 
    { 
     if ($count >= 50) 
      $stack = 8; 
     elseif ($count >= 25) 
      $stack = 7; 
     elseif ($count >= 10) 
      $stack = 6; 
     elseif ($count >= 5) 
      $stack = 5; 
     elseif ($count >= 4) 
      $stack = 4; 
     elseif ($count >= 3) 
      $stack = 3; 
     elseif ($count >= 2) 
      $stack = 2; 
     else 
      $stack = 1; 

     return $stack; 
    } 
} 

class Items 
{ 
    public static $outputDir = ''; 
    public static $files = array(); 

    private static $otb, $dat, $spr; 
    private static $lastItem; 
    private static $loaded = false; 

    public function __destruct() 
    { 
     if(self::$otb) 
      fclose(self::$otb); 
     if(self::$dat) 
      fclose(self::$dat); 
     if(self::$spr) 
      fclose(self::$spr); 
    } 

    public static function generate($id = 100, $count = 1) 
    { 
     if(!self::$loaded) 
      self::load(); 

     $originalId = $id; 
     if($id < 100) 
      return false; 
      //die('ID cannot be lower than 100.'); 

     rewind(self::$otb); 
     rewind(self::$dat); 
     rewind(self::$spr); 

     $nostand = false; 
     $init = false; 
     $originalId = $id; 

     // parse info from otb 
     while(false !== ($char = fgetc(self::$otb))) 
     { 
      $byte = HEX_PREFIX.bin2hex($char); 

      if ($byte == 0xFE) 
       $init = true; 
      elseif ($byte == 0x10 and $init) { 
       extract(unpack('x2/Ssid', fread(self::$otb, 4))); 

       if ($id == $sid) { 
        if (HEX_PREFIX.bin2hex(fread(self::$otb, 1)) == 0x11) { 
         extract(unpack('x2/Sid', fread(self::$otb, 4))); 
         break; 
        } 
       } 
       $init = false; 
      } 
     } 

     self::$lastItem = array_sum(unpack('x4/S*', fread(self::$dat, 12))); 
     if($id > self::$lastItem) 
      return false; 

     //ini_set('max_execution_time', 300); 
     // parse info from dat 
     for($i = 100; $i <= $id; $i++) { 
      while(($byte = HEX_PREFIX.bin2hex(fgetc(self::$dat))) != 0xFF) { 
       $offset = 0; 
       switch($byte) { 
        case 0x00: 
        case 0x09: 
        case 0x0A: 
        case 0x1A: 
        case 0x1D: 
        case 0x1E: 
         $offset = 2; 
         break; 

        case 0x16: 
        case 0x19: 
         $offset = 4; 
         break; 

        case 0x01: 
        case 0x02: 
        case 0x03: 
        case 0x04: 
        case 0x05: 
        case 0x06: 
        case 0x07: 
        case 0x08: 
        case 0x0B: 
        case 0x0C: 
        case 0x0D: 
        case 0x0E: 
        case 0x0F: 
        case 0x10: 
        case 0x11: 
        case 0x12: 
        case 0x13: 
        case 0x14: 
        case 0x15: 
        case 0x17: 
        case 0x18: 
        case 0x1B: 
        case 0x1C: 
        case 0x1F: 
        case 0x20: 
         break; 

        default: 
         return false; #trigger_error(sprintf('Unknown .DAT byte %s (previous byte: %s; address %x)', $byte, $prev, ftell($dat), E_USER_ERROR)); 
         break; 
       } 

       $prev = $byte; 
       fseek(self::$dat, $offset, SEEK_CUR); 
      } 
      extract(unpack('Cwidth/Cheight', fread(self::$dat, 2))); 

      if ($width > 1 or $height > 1) { 
       fseek(self::$dat, 1, SEEK_CUR); 
       $nostand = true; 
      } 

      $sprites_c = array_product(unpack('C*', fread(self::$dat, 5))) * $width * $height; 
      $sprites = unpack('S*', fread(self::$dat, 2 * $sprites_c)); 
     } 

     if (array_key_exists(stackId($count), $sprites)) { 
      $sprites = (array) $sprites[stackId($count)]; 
     } 
     else { 
      $sprites = (array) $sprites[array_rand($sprites) ]; 
     } 

     fseek(self::$spr, 6); 

     $sprite = imagecreatetruecolor(32 * $width, 32 * $height); 
     imagecolortransparent($sprite, imagecolorallocate($sprite, 0, 0, 0)); 

     foreach($sprites as $key => $value) { 
      fseek(self::$spr, 6 + ($value - 1) * 4); 
      extract(unpack('Laddress', fread(self::$spr, 4))); 

      fseek(self::$spr, $address + 3); 
      extract(unpack('Ssize', fread(self::$spr, 2))); 

      list($num, $bit) = array(0, 0); 

      while($bit < $size) { 
       $pixels = unpack('Strans/Scolored', fread(self::$spr, 4)); 
       $num += $pixels['trans']; 
       for($i = 0; $i < $pixels['colored']; $i++) 
       { 
        extract(unpack('Cred/Cgreen/Cblue', fread(self::$spr, 3))); 

        $red = ($red == 0 ? ($green == 0 ? ($blue == 0 ? 1 : $red) : $red) : $red); 

        imagesetpixel($sprite, 
         $num % 32 + ($key % 2 == 1 ? 32 : 0), 
         $num/32 + ($key % 4 != 1 and $key % 4 != 0 ? 32 : 0), 
         imagecolorallocate($sprite, $red, $green, $blue)); 

        $num++; 
       } 

       $bit += 4 + 3 * $pixels['colored']; 
      } 
     } 

     if ($count >= 2) { 
      if ($count > 100) 
       $count = 100; 

      $font = 3; 
      $length = imagefontwidth($font) * strlen($count); 

      $pos = array(
       'x' => (32 * $width) - ($length + 1), 
       'y' => (32 * $height) - 13 
      ); 
      imagestring($sprite, $font, $pos['x'] - 1, $pos['y'] - 1, $count, imagecolorallocate($sprite, 1, 1, 1)); 
      imagestring($sprite, $font, $pos['x'], $pos['y'] - 1, $count, imagecolorallocate($sprite, 1, 1, 1)); 
      imagestring($sprite, $font, $pos['x'] - 1, $pos['y'], $count, imagecolorallocate($sprite, 1, 1, 1)); 

      imagestring($sprite, $font, $pos['x'], $pos['y'] + 1, $count, imagecolorallocate($sprite, 1, 1, 1)); 
      imagestring($sprite, $font, $pos['x'] + 1, $pos['y'], $count, imagecolorallocate($sprite, 1, 1, 1)); 
      imagestring($sprite, $font, $pos['x'] + 1, $pos['y'] + 1, $count, imagecolorallocate($sprite, 1, 1, 1)); 

      imagestring($sprite, $font, $pos['x'], $pos['y'], $count, imagecolorallocate($sprite, 219, 219, 219)); 
     } 

     $imagePath = self::$outputDir . ($count > 1 ? $originalId . '-' . $count : $originalId) . '.gif'; 

     // save image 
     imagegif($sprite, $imagePath); 
    } 

    public static function load() 
    { 
     if(!defined('HEX_PREFIX')) 
      define('HEX_PREFIX', '0x'); 

     self::$otb = fopen(self::$files['otb'], 'rb'); 
     self::$dat = fopen(self::$files['dat'], 'rb'); 
     self::$spr = fopen(self::$files['spr'], 'rb'); 

     if(!self::$otb || !self::$dat || !self::$spr) 
      die('ERROR: Cannot load data files.'); 
     /* 
     if ($nostand) 
     { 
      for($i = 0; $i < sizeof($sprites)/4; $i++) 
      { 
       $sprites = array_merge((array) $sprites, array_reverse(array_slice($sprites, $i * 4, 4))); 
      } 
     } 
     else 
     { 
      $sprites = (array) $sprites[array_rand($sprites) ]; 
     } 
     */ 

     self::$loaded = true; 
    } 

    public static function loaded() { 
     return self::$loaded; 
    } 
} 
+1

아무것도 변경되었지만 다른 문제가있을 수 있습니다. 전체 기능/코드, 특히 파일에 대한 다른 할당 (예 :)을 표시해야합니다. – junkfoodjunkie

+0

코드를 추가했습니다 – slawkens

+0

예 ... 모든 코드를 추가했습니다 ... 최소한의 예를 만드십시오. fseek()를 사용하는 함수와 관련된 코드 만 사용하십시오. 그러나 fseek 함수가 아닌 fseek 함수를 둘러싼 다른 코드 일 것입니다. – junkfoodjunkie

답변

0

무한 루프의 가능성이있다.

max_execution_time = 360  ; Maximum execution time of each script 

하거나 스크립트의 시작이 명령을 넣어 : 당신은 루프가 확인 생각한다면, 다음과 같은 당신이 좋아하는의 php.ini 파일의 실행 시간을 증가하려고 할 수있다

set_time_limit(0); 
+0

시도했습니다. 그것은 끝없는 루프처럼 내가 300 실행 시간을 설정하려고했는데 그것은 치명적인 오류도 끝난 것 같습니다. – slawkens

+0

그리고 지금 뭐라고 쓰여 있니? 같은 시간 (초)? – shojibur

관련 문제