Nejste přihlášeni
Stránky 1
Dobry den,
od verze PHP 5.3 lze pouzivat anonymni funkce a jeste donedavna na Endore fungovaly. Nyni mi prestaly fungovat stranky (http://www.bogan.cz) a pravdpodobne za to muze nedavny upgread PHP na verzi 5.3.13.
Kdyz si spustim na starsi verzi PHP (5.3.X) nasledujici kod, tak to v poho probehne a kdyz to spustim na Endore, tak to zahlasi chybu.
Bojim se, ze s tim moc nenadelate, protoze to vypada na problem v PHP. Zkusim si nainstalovat u sebe PHP 5.3.13, abych zjistit, zda to je problem PHP nebo Endory. Pokud udelate downgrade PHP nebo to nejak opravite, tak budu vdecny. Na teto adrese mate PHP, kterym to vzdy muzete otestovat http://www.bogan.cz/test.php
Ukazkovy kod:
$promenna='neco';
$fce1=function() { echo 'Fce 1 spustena<br>'; };
$fce2=function() use ($promenna) { echo 'Fce 2 spustena, $promenna='.$promenna.'<br>'; };
$fce1();
$fce2();
Na starsim PHP (5.3.X) to vrati:
Fce 1 spustena
Fce 2 spustena, $promenna=neco
Na Enodre PHP (5.3.13) to vrati:
Fce 1 spustena
Fatal error: Function name must be a string in ... on line ...
Offline
Ak to nefunguje na novej verzií je nutné si to preprogramovať tak aby to bežalo korektne podľa nových ustanovení PHP. Verzie sa aktualizujú preto lebo sa príde na nejakú závadu a aby sa to zabezpečilo vydá sa nová verzia, tj ísť späť na staršiu nepripadá v úvahu.
Offline
Pak jsem jeste objevil chybu v preg_replace_callback, kdy pretece pamet, ale zatim jsem neudelal testovaci/ukazkovy skript chyby.
Zadne zmeny ve verzi 5.3.13 v tech funkcich, co tu zminuji, neprobehly. Do dokumentace funkci i do changelogu PHP jsem se samozrejmne podival ihned pri nalezeni chyby. Popisovana chyba je spis downgrade funkcnosti a to v PHP davaji vedet hodne dopredu pomoci chyby E_DEPRECATED.
Tato chyba urcite neni planovana uprava PHP.
Offline
Tak je to 100% problem na endore. Stahnul jsem si do lokalniho pocitace veriz 5.3.13 a zminene chyby to nedela.
Zkuste si opakovane volat stranku http://www.bogan.cz/preg_replace.php a budou se vam dit ruzne 3 chyby:
- Nebyla přijata žádná data
- Warning: preg_replace_callback() Requires argument 2, '', to be a valid callback in preg_replace.php
- Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 365590041 bytes)
Dokonce pretece pamet a to v tom souboru je jen
$fcep=function(){
return 'x';
};
$text=preg_replace_callback('/[0-9]/',$fcep,'abcdefghijkl12345679'); //toto nahradi cisla za znak x
echo $text.'<br>';
// nasledujici cast ovlivnuje chovani i beh predchozi funkce a to je uz fakt divne
$promenna='neco';
$fce1=function() { echo 'Fce 1 spustena<br>'; };
$fce2=function() use ($promenna) { echo 'Fce 2 spustena, $promenna='.$promenna.'<br>'; };
$fce1();
$fce2();
Je mi lito, ale tohle je opravdu problem u vas. Moc zakazniku tyto moznosti asi nepouziva, ale urcite se jich par najde.
Offline
Ako píše chyba, funkcia požaduje parameter 2. Ak si čítal manuál k danej funkcií http://cz2.php.net/preg_replace_callback tak druhý parameter nemôže byť premenná ale mal by byť typu callable http://cz2.php.net/manual/en/language.t ... llable.php
$text=preg_replace_callback('/[0-9]/',$fcep,'abcdefghijkl12345679'); - špatne
$text=preg_replace_callback('/[0-9]/',function(),'abcdefghijkl12345679'); - správne
- sám to otestované nemám, výsledok čerpám z manuálu
Offline
Na strance
http://php.net/manual/en/functions.anonymous.php
najdete kod
$service = function($foo) {
echo "Service returns: $foo";
};
coz je dukaz ze to jde. Najdete tam spoustu ukazek, ze anonymni fci lze definovat jako prommenou. Jinak by postradaly smysl.
Dnes jsem si stahl verzi 5.3.13 a v poradku vse funguje. Webovky jsem si pozmenil, aby mi bezely i na vasi rozbite verzi. Berte to spis tedy jako informovani, ze vam pri kompilace php doslo asi k chybe. Tohlo opravdu ma fungovat, jsem v tom profik :-).
Chapu, ze vy s tim moc nenadelate a musite pockat na nejaky BUG fix. Problem je, ze na jinem 5.3.13 se to nedeje.
Preji hodne zdaru.
Snad se vam to casem podari opravit.
Offline
Zkuste vypnout eaccelerator ... resilo se to tu
Offline
ZABRALO, mate medaili :-). Eaccelerator u sebe nepouzivam, v zivote by mne to nenapadlo.
Diky moc
Offline
Stránky 1