[PHP] Nagle zakonczenie problemu

0

witam,

Pisze skrypt PHP który przerabia dużą ilość danych (10000 porównań to norma). Problem polega na tym że po pewnym czasie skrypt przestaje działać a ostatnie linijki wyświetlone to:

	P[q� Š,yKˇ
ŕŽAę˘(�} $Zb"�EĹ��ţ¨"˙Šňu�`GJňKç)°Ny�HŢ=w÷ÜńH÷§ÓˇăŮÇó	ź�˝�Âůű�éŮŹ�m�x6śíÓŮi˝pĐßŘöäwkÔuő�~M�Oń�RE V*ëŃż
víYcÁĺŞ7+3jAP�<KŃeÇ*M�ÄDćTy,˝ŁŁĂ˝}ë[@SÂŁ�Dë`Y�]7WeBAĄĄ?Čs\č�/Ânç(Ţ���%ĽD2�ś}\ER<tŕÉÜ<C0�9Ť¨GŮ
�I�t`3E��N�ph×T���
ŐÁ ť6ş~�v� �łGé˘Ý!l*ë�z$aw Ŕ°ŠDg�8ą@¸5!
�$�	�â�Óá�ű�şŽmXB�ggłédÔÝŃRť8ß�]ťÉäÉŰÓ�`�=Ë��'/ÍŁéÖ�˛ëVfÍżĆ=�F_â?E|LĚ��*öŹÁŢŢĎŚD�TzÖŚ�&IFÂ�ńh9Î3´ă�#t
­äČĹT4Ë�3čFÖł�˛�M�,aWĐc)��SČdÇŚR˘�"Čí�äôŞąůîbʢX9°ŻSű]1 í0ž:kNŻç4ĄseŐkŹŚDF�÷ô˘sp�ÝX#×M´wŽí�\Ek[�Ć��V:]ýÖoý!Ç_9>ŘĆR[	/ý3Ü�ö­ÁnÁ¨w\uÇÔ�ů¨=~¤ÚŇTcm3÷pÝ��Č�ťł7ŻŕÝĹŘłÖ2lžt�-�ăéĚł¨ŤŚĽ´FëČBí˙ŤŔÜřŮč�Á�pŚ��$đ�J˝'M˘Ŕ�tÁď�Źx	ţÝgd�Ę�ÄľQoÍ�IŢ#�jW:żp?Ď�­�ú�đNŔĎúP�ŁyE9Ł�II�0~uśIá×ňW�ĎYTH\˛~z.E^ÝC���\)ą _ g÷P	SĆYŽ°	ISh5Ücx}1yŠK�%J8ę§$GO��¨`|žßç¤Z�~�ü�ţ%
�w�ćС �Î		á��Ť§đţbęŮJ`�lčćg+�ďgqś
˙a;KĎěă,M0Č´��Š	*  ¨HŽ	��.Î��ŐżťXHRaŘ�ŔnÎ0^ĆyÄPChÎ�.ĄŻÔß�B*˘;LEů	ŻĘ *ů窿�ĐQŤVł]ô˙¨ĆYLuę]By�ŰW)JsdŹŮDfcţŚ,ÚâÓŮEŠ$���NŃb*Ě�Hł�*
Ľ($Čş@úp�PěăćĆ�je|ŁL˙Ű"ýQ%Ú4uyé�Rs�b)5
�APÔĚężRĹŘÚ5;Č*f�ë�!ŢP�(HIY/¤ČQ{�÷=Ĺ9rYA.��~
UwŰú8őŹçx�Ć�+Öö~¸:Ξ:ęÖNşn]rzv9Wß?ęSŇľő�ĆÜpĚ�ţýJ�Mî

Czy można jakoś sprawdzić dlaczego skrypt został 'zabity' ? (Nie mam dostępu do logów serwera, wszystko co mogę zrobić to dopisać coś w PHP)

Nie został na pewno zabity za przekroczenie dozwolonej ilości zajmowanej pamięci, ani za przekroczenie czasu wykonania.

0

"Podziwiamy...", a tak do rzeczy to mógłbyś nam udostępnić ten skrypt jeśli mamy rozwiązać problem? ...

0
  1. Ciekawi mnie co skrypt robi, skoro 10000 porownan to norma.
  2. To co wypisales to smieci, moze to byc np. tresc binarnego pliku, cokolwiek. Dolaczam sie do propozycji zalaczenia tresci skryptu. Do tego opisz sytuacje (kiedy tak sie dzieje, w jakim momencie, w jakich warunkach, itp).
0

no w tym problem, że udostępnić źródła nie mogę. I poza tym ma ono ponad 200kb więc trudno dodać tu źródła.

Ale może jutro uda mi się zrobić jakiś prosty przykład, dla pokazania problemu.

Ale głównie w pytaniu chodziło mi czy jest jakaś ogólna metoda, sprawdzenia dlaczego.
Bo wiem ze dobry składniowo skrypt możne przestać działać z 2 przyczyn, przekroczenie limitu pamięci i czasu wykonania. Jest jakaś inna możliwość ?

0

pewnie że jest - błąd w skrypcie

0

W przypadku każdego zabicia przez "siłę wyższą", zostanie dołączony do zawartości strony komunikat PHP. Wygląda to tak jakby robiło readFile() na jakimś pliku struktury binarnej, a potem zamykało skrypt samodzielnie.

0
Demonical Monk napisał(a)

W przypadku każdego zabicia przez "siłę wyższą", zostanie dołączony do zawartości strony komunikat PHP. Wygląda to tak jakby robiło readFile() na jakimś pliku struktury binarnej, a potem zamykało skrypt samodzielnie.

No problem pojawia się przy operowaniu przez dłuższy czas na plikach tekstowych. (chociaż przykład dam na obrazkach ;P)

Co do komunikatu dlaczego zabity to nie pojawia się nic w formie 'ludzkiej'. Skrypt radośnie drukuje sobie '.' i nagle komunikat ten co wyżej.

Przykład kodu (zmienne mogą troszkę dziwnie chodzić ale to wycinek całego skryptu (coś ala jedna 'ścieżka' działania która wywołuje błąd):

<?PHP
	$userInfo = Array('User'=>'USER','Pass'=>'PASS');
	$soapClient = new SoapClient('URL?WSDL',array('soap_version' => SOAP_1_2,'encoding' => 'UTF-8'));
	
	function zbierzZdjecie($id = '')
	{
		global $userInfo;
		if (empty($id)) return Array();
		
		try
		{
			$params = $userInfo + Array('Zdjecie' => $id);
			$result = $soapClient->WezZdjecie($params);
			
			if (isset($result->WezZdjecieResult) && isset($result->WezZdjecieResult->PZdjecie))
			{
				if (!is_array($result->WezZdjecieResult->PZdjecie))
				{
					$result = Array(Array('URL'=>$result->WezZdjecieResult->PZdjecie->URL,'dodano'=>$result->WezZdjecieResult->PZdjecie->addDate));
				} else
				{
					$tResult = Array();
					foreach($result->WezZdjecieResult->PZdjecie as $picture)
					{
						if (isset($picture->URL) && isset($picture->addDate))
							$tResult[] = Array('URL'=>$picture->URL,'dodano'=>$picture->addDate);
					}
					$result=$tResult;
				}
			} else return Array();
		} catch (Exception $e)
		{
			die('Błąd pobierania zdjec.');
		}
		return $result;
	}
	
	function znajdzZdjecia()
	{
		echo("\nPhotos:");
		$errorCounter = 0;$cntItems = 0;
		
		$listaZdjec = Array('photo1','photo2','zdjecie1','zdjecie2','2','4'); //tutaj tak dalej do powiedzmy 10000
		foreach($listaZdjec as $zdjecie)
		{
 			if(!file_exists('zdjecia/'.$zdjecie.'.jpg'))
 			{
 				$cntItems++;
 				$infoPhoto = zbierzZdjecie($zdjecie);
 				for($i=0;$i<count($infoPhoto);$i++)
 				{
 					switch($i)
 					{
 						case 0:
 							if (!downloadPhoto($zdjecie,$infoPhoto[$i]['URL']))
 								$errorCounter++;
 							break;
 						case 1:
 							if (!downloadPhoto($zdjecie.'a',$infoPhoto[$i]['URL'],true))
 								$errorCounter++;
 							break;
 						case 2:
 							if (!downloadPhoto($zdjecie.'b',$infoPhoto[$i]['URL'],true))
 								$errorCounter++;
 							break;
 						case 3:
 							if (!downloadPhoto($zdjecie.'c',$infoPhoto[$i]['URL'],true))
 								$errorCounter++;
 							break;
 						case 4:
 							if (!downloadPhoto($zdjecie.'d',$infoPhoto[$i]['path'],true))
 								$errorCounter++;
 							break;
 						case 5:
 							if (!downloadPhoto($zdjecie.'e',$infoPhoto[$i]['path'],true))
 								$errorCounter++;
 							break;
 					}
 				}
 				echo('.');
 				unset($infoPhoto);
				if ($errorCounter > 50)
				{
					echo('ERROR: Ponad 50 razy nie udało się zapisać danych na dysku lokalnym !!!<br/>');
					die('ERROR: Skrypt został zatrzymany !!!');
				}
 			}
 			set_time_limit(30); // uncomment in final version
 			echo(".");flush();
 		}
 		return $cntItems;
	}
	function downloadPhoto($zdjecie,$url,$additional=false)
	{
		$imageBuffer = '';
		
		if (empty($zdjecie)) return false;
		$plikRead = @fopen('URL_DO_STRONY/'.$url,'r');
		if (!$plikRead)
		{
			echo('ERROR: Nie mozna pobrac pliku '.$zdjecie.' - '.$url.'<br/>');
			return false;
		}
			
		$plikWrite = @fopen('zdjecia/'.$zdjecie.'.jpg','w');
		if (!$plikWrite)
		{
			echo('ERROR: Nie można zapisać pliku na lokalnym serwerze. <br/>');
			fclose($plikRead);
			return false;
		}
		
   		while (!feof($plikRead))
   		{
           	fwrite($plikWrite,fread($plikRead, 4096));
       	}
       	
       	fclose($plikRead);
       	fclose($plikWrite);
		
		if (!miniaturka('zdjecia/'.$productID.'.jpg',$additional))
			return false;
        
        return true;
	}
	function miniaturka($photoPATH,$additional=false)
	{
		$thumbName = substr($photoPATH,0,strrpos($photoPATH,'.'));
		
		$im = @imagecreatefromjpeg($photoPATH);
		if (!$im) 
		{
			echo('ERROR: Unable to open image: '.$photoPATH);
			return false;
		}
		$x=imagesx($im);$y=imagesy($im);
		
		if ($additional==false)
		{
			//ROBIMY GIFA
			$dy = round((150*$y)/$x);

			$tIm = @imagecreatetruecolor(150,$dy);
			if (!$tIm)
			{
				echo('ERROR: Unable to create thumbnail.');
				imagedestroy($im);
				return false;
			}
			imagecopyresampled($tIm,$im,0,0,0,0,150,$dy,$x,$y);
			imagegif  ($tIm, $thumbName.'.gif' );
			imagedestroy($tIm);
			
		
			//ROBIMY PNG
			$dy = round((83*$y)/$x);
			$tIm = @imagecreatetruecolor(83,$dy);
			if (!$tIm)
			{
				echo('ERROR: Unable to create thumbnail.');
				imagedestroy($im);
				return false;
			}
			imagecopyresampled($tIm,$im,0,0,0,0,83,$dy,$x,$y);
			imagepng  ($tIm, $thumbName.'.png' );
			imagedestroy($tIm);
		} else
		{
			//ROBIMY PNG
			$dy = round((40*$y)/$x);

			$tIm = @imagecreatetruecolor(40,$dy);
			if (!$tIm)
			{
				echo('ERROR: Unable to create thumbnail.');
				imagedestroy($im);
				return false;
			}
			imagecopyresampled($tIm,$im,0,0,0,0,40,$dy,$x,$y);
			imagepng  ($tIm, $thumbName.'.png' );
			imagedestroy($tIm);
		}

		imagedestroy($im);
		return true;
	}
	
	
	znajdzZdjecia();
?>

działanie jest następujące.
znajdzZdjecia() wyszukuje zdjęć brakujących u nas na komputerze.
jeżeli jakiegoś brakuje to zbierzZdjecie() pobiera z WebSerwisu informacje o nim które następnie przekazuje do downloadPhoto().
downloadPhoto() pobiera brakujące zdjęcie i miniaturka() tworzy miniaturki w png i gif

Nie wiem czy to właśnie nie wina SOAPClienta (korzystam z tego wbudowanego w PHP5). Bo przy większej ilości zapytań SOAP (ok 1000) zawsze mi się wykrzacza.

0

Myślę że to właśnie wina SOAP, ponieważ żadna zdrowa klasa w PHP nie zwracała by danych.

0

hmm no właśnie nie wiem, tak właśnie przyszło mi do głowy że może spróbuje usuwać za każdym razem (do każdego zapytania) object SOAPClient i od nowa go tworzyć .. może on trzyma w pamięci jakieś dane (chociaż w dokumentacji SOAP nic nie znalazłem, albo spróbuje NuSOAP .. z nim nie miałem takich problemów :/)

1 użytkowników online, w tym zalogowanych: 0, gości: 1