ugrás a tartalomhoz

Php 5.3 hibát dob

inf · 2009. Aug. 29. (Szo), 11.18
Sziasztok!

Van egy idegesítő dolog a php 5.3-ban.
Megtaláltam itt a megoldást rá. Vagyis azt magyarázzák, hogy ez nem bug stb... Viszont nem értem, hogy akkor hogyan lehet megszerelni :-)

function pass_by_reference( &$param ) {
	$param[] = "another entry";
}

$data = array( "a first entry" );
call_user_func( "pass_by_reference", $data );
//Warning: Parameter 1 to pass_by_reference() expected to be a reference, value given in test.php on line 234568

var_dump($data);
// $data contains only one element ( "a first entry" )


$data = array( "a first entry" );
call_user_func( "pass_by_reference", &$data ); 
// Warning: Call-time pass-by-reference has been deprecated - argument passed by value

var_dump($data);
// $data contains both elements ( "a first entry","another entry" )
Egyelőre nem értem, hogy ez mit jelent :-P
Mmint eddig úgy volt, hogy a tömböket és stringeket másolta a php (ami szerintem alapból marhaság), php5-ben volt annyi eszük, hogy az objectekre beszűntették ezt a dolgot.

Én egy hasonló függvényben, mint a fenti szeretnék átadni stringet, és nem szeretném, ha másolná a php, mert az lassít. A dolog viszont nagyon nem akar menni. Elvileg azt javasolták, hogy &-et kell tenni a paraméter elé függvény hívásakor, viszont akkor a deprecatedes hibaüzenetet kapom. Ha nem teszek &-et, akkor meg a warning nem engedi lefutni a függvényt.

Most akkor hogy lehet megoldani, hogy ne másolódjon a paraméter, és minden rendben menjen?
 
1

-----------

inf · 2009. Aug. 29. (Szo), 11.28
-----------
2

:?

fchris82 · 2009. Aug. 29. (Szo), 12.59
1. Mekkora az oldalad forgalma?
2. Egy oldalletöltésnél hányszor hívod meg átlag így a fv-eket?
3. Megmérted, hogy mekkora "lassulást" is okoz az általad vázolt probléma? Nem idealizált tesztekre gondolok, hanem százalékosan egy komplett oldal betöltése (képekkel, CSS-sel, js-sel, teljes rendereléssel) mennyivel is lesz lassabb?
4. Nincs más mód a fv hívogatására?

Talán a harmadik a legfontosabb kérdés. Mert ha az jön ki, hogy egy oldal betöltése mindennel együtt 1 másodperc, te meg egy 3 ms-os gyorsításról beszélsz, akkor sztem gondold újra, hogy érdemes-e az életedből akár 1 percet is arra szánni, hogy ezt az égető problémát megold...
6

Leegyszerűsíted.

inf · 2009. Aug. 30. (V), 14.07
Itt nem egy oldalról van szó, hanem egy olyan rendszerről, amit általánosan használni fogok. Szóval minél gyorsabb, annál jobb. Nyilván ha van lehetőség arra, hogy ne kelljen minden hívásnál másolni a stringet és tömböt, akkor használni fogom.
Szóval gyakorlatilag megmondtad a semmit.
8

khm

erenon · 2009. Aug. 30. (V), 14.51
A semmit te mondtad meg, amikor nem mondtad, hogy mire kell.
9

...

inf · 2009. Aug. 30. (V), 19.55
Nem akarok kötekedni, de gyakorlatilag lényegtelen, hogy mire kell. Anélkül is megkaptam rá a jó megoldást.

Mondjuk attól még érdekelne, hogy miért nem lehet mindezt elintézni a call_user_func-al, amikor php 5.3-ig még simán ment. Jobban tetszene, ha nem változtatnának minden verzió után. Elég lenne egyszer jól kigondolni.
10

:?

fchris82 · 2009. Aug. 31. (H), 11.05
Okkal tettem fel a kérdéseket és nem megmondtam a semmit, hanem a leginkább elképzelhető esetre "reagáltam", és próbáltam egyfajta szemléletre felhívni a figyelmed, majd vártam a választ a kérdésekre.
Vannak problémák, amiket nem kell megoldani VAGY eleve vannak rá más megoldások és nem kell azon az úton erőltetni. Erre próbáltalak rávezetni.

Arról nem is beszélve, hogy te itt optimalizálásról beszélsz, holott a call_user_func() megoldás közel 2-szer olyan lassú, mint ha natív hívod a fv-t, tehát ha ennyire a teljesítményre hajtasz, akkor még olvasgass egy-két benchmarkot... A végül talált megoldásod már csak 10-20%-al, de azt le kéne mérni, hogy ez most mennyit is jelent kombinálva a változó másolgatás elkerülésével.

Egyébként meg nem biztos, hogy be kéne szólogatni, mert az elég paraszt viselkedés, és nem biztos, hogy segíti a későbbi segítségnyújtást.
11

ofc

inf · 2009. Aug. 31. (H), 12.03
Okkal tettem fel a kérdéseket és nem megmondtam a semmit, hanem a leginkább elképzelhető esetre "reagáltam", és próbáltam egyfajta szemléletre felhívni a figyelmed, majd vártam a választ a kérdésekre.

Nyilván én meg okkal használtam azt a függvényt. Az objektum és a metódus is változó benne, más út pedig nincsen a megoldásra a PCRE motor hibája miatt. Egy ilyen egyszerű problémánál nem fogom elkezdeni magyarázni 1000 sor kód működését, mert semmi köze a dologhoz.

A cuccot nem mértem le, hogy mennyi lassulást okoz, mert nekem ezred másodpercek is számítanak. Egyelőre meg nem vallom azt a nézetet, hogy először írjuk meg a programot, aztán utána kezdjünk el optimalizálni, mert php-ben nincsenek meg ehhez az eszközök.
A call_user_func egy foreach-ben van/volt, ebből adódóan elég gyakran meghívom. A foreach egy template compiler token feldolgozója. Mélyebben nem megyek bele.

Egyébként meg nem biztos, hogy be kéne szólogatni, mert az elég paraszt viselkedés, és nem biztos, hogy segíti a későbbi segítségnyújtást.

Nem baj, én szeretek beszólogatni.
13

korai optimalizáció, bottleneck

erenon · 2009. Aug. 31. (H), 12.30
Nem neki kell hinned, hanem Knuth-nak:
"Premature optimization is the root of all evil"

Ugyan miért nincs meg a kései optimalizációnak a lehetősége PHP-ben?
Valamint ha nem mérted le a kódot, _teljesen_ felesleges ilyen apróságokkal bajlódnod első körben. Ott tudsz a legtöbbet nyerni, ahol a legtöbbet veszítesz. Fogj egy xdebugot és mérd szépen le.

Blogmark volt, talán érint: The truth about php variables

És hogy ne csak a semmit mondjuk, ha leméred a kódot, kérlek oszd meg velünk, hogy mennyit nyertél ezen a problémán, köszi.
15

Kösz

inf · 2009. Szep. 1. (K), 22.41
Kösz, de már fogtam xdebugot, és nem mentem vele semmire. Gyakorlatilag a kódomban nincs semmi, amit el lehetne hagyni, ha meg függvényeket vennék el, attól teljesen átláthatatlan lenne a dolog.

Magát a & nélküliséget nem mértem le, mert kb 15-20 helyen kéne átírnom különböző fájlokban függvényeket, ehhez meg lusta vagyok egy mérés miatt. Számomra egyébként lényegtelen, hogy mit mérnék vele, tudom, hogy gyorsabb lesz tőle a kód. A dolog megítélése meg szerintem téves, mert nem tartozik az optimalizáláshoz. Gyakorlatilag egy paramétert adok tovább a feldolgozó függvényig. Teljesen mindegy, hogy módosul e az eredeti, mert csak és kizárólag a feldolgozó függvény használja, más nem. Szóval inkább tervezési kérdés, mint optimalizálási.
12

Hmm

inf · 2009. Aug. 31. (H), 12.15
Igazából nem érzem úgy, hogy válaszolnom kéne.

Az általad felvázolt szemléletmódban már eljutottam a 4-es pontig, amikor feltettem a kérdést. Ezért gyakorlatilag semmi újat nem mondtál. Egyébként meg nem érdekel, hogy szerinted beszólás vagy sem.
3

ezt próbáltad?

TeeCee · 2009. Aug. 29. (Szo), 15.44

$func_name = 'pass_by_reference';
$funcname($data);
4

Nem próbáltam.

inf · 2009. Aug. 29. (Szo), 20.30
Egyébként array($object,$method), amit adok neki, nem szimplán egy függvénynév.
5

???

TeeCee · 2009. Aug. 30. (V), 13.14
Egyrészt elírtam:

$func_name = 'pass_by_reference';  
$func_name(&$data);  
Másrészt micsoda nem szimplán egy függvénynév?
Amit most írtál - array($object,$method) - az nem szerepel a kódodban sehol, így nem tudom beazonosítani.
7

Callback paraméter

inf · 2009. Aug. 30. (V), 14.08
A call_user_func callback paramétere 3 típusú lehet. Egyrészt string, ami a függvénynév, vagy tömb. A tömbnél az első érték ha statikus, akkor az osztálynév, ha viszont nem statikus, akkor az objektum, aminek a metódusát hívod. Jelen esetben én objektumok metódusait hívom egy foreachben. Belegondolva:

$object->$function($data);
lehetséges, hogy működik.

Egyébként ez a függvényhívás

$func_name(&$data); 
100%, hogy ugyanazt a deprecated hibát dobja.



szerk:
Jah, kipróbáltam, működik. Kösz a segítséget.
14

a php, illetve a zend engine

Tyrael · 2009. Aug. 31. (H), 22.38
a php, illetve a zend engine copy-on-write technologiaja alapjan lehet hogy a php-ban ha nem referenciakent adod at a valtozot, akkor masolat jon letre, de ez a masolat minimalis eroforrasba kerul egeszen addig, amig nem vegzel rajta modositast, lasd itt:
http://www.trl.ibm.com/people/mich/pub/200901_popl2009phpsem.pdf
ez alapjan szerintem minimalis overheadje lehet az ertek szerinti atadasnak a referencia szerintivel szemben.
sot, http://www.thedeveloperday.com/php-lazy-copy/ itt azt irjak, hogy adott esetben a referencia szerinti parameter atadas pont emiatt meg lassabb is lehet.

Tyrael
16

Hmm

inf · 2009. Szep. 1. (K), 22.43
Na ez viszont már érdekel, azt hiszem mégiscsak veszem a fáradságot(egyébként fáradtság vagy fáradság? szerintem fáradság), és lemérem.
17

Eredmény

inf · 2009. Szep. 2. (Sze), 11.57
XDebug szerint...

Körülbelül 10-15 ilyen paraméter átadás hoz az én gépemen 0.1 msec gyorsulást.
Így lett a 2.7 msec-es programból 2.5 msec-es. Szóval érdemes használni.
A különbség egyértelműen az érintett függvényekből jön ki.

Ami miatt rühellem az xdebugot, hogy 0.1 msec alá képtelen bemenni, így kb 90%-a a függvényeknek nem vizsgálható.


Microtime-al lehetne mérni egy teszten, de azt meg bárki megcsinálja.