Błąd 500 – na jednym komputerze działa, na innym nie

Dzisiaj pracuję sobie nad pewnym skryptem PHP i testuje u siebie na localhostcie. Po wszelkich testach przerzuciłem na serwer docelowy. Odpalam aplikację i bum… piękna 500. Zastanawiam się, co jest grane? Może nie skopiowałem czegoś? Błąd konfiguracji? Przechodzę jednak krok po kroku po wszystkich możliwościach, jest OK.

W takim razie musiałem zaglądnąć do logów Apache.

[Fri Sep 20 13:15:11.225284 2013] [:error] [pid 4341] [client 192.168.1.118:55243] PHP Fatal error:  Call-time pass-by-reference has been removed in /var/www/mieszarka/php/run_algorithm.php on line 45, referer: http://192.168.1.118/mieszarka/index.php

Fatal error nie brzmi najlepiej… zwłaszcza jak pierwszy raz spotkałem się z takim błędem. Szybciutko google i okazało się, że błąd nie jest aż tak straszny jak się wydawało.

Błąd polegał na przekazaniu referencji dla argumentu w wywołaniu funkcji. Ale czemu na jednym serwerze było ok, a na drugim nie? Odpowiedzią jest wersja PHP – w 5.3 jest ok, natomiast w 5.4 taka konstrukcja została wycofana, co zostało ładnie posiane na stronie PHP:

http://pl1.php.net/manual/en/language.references.pass.php

Note: There is no reference sign on a function call – only on function definitions. Function definitions alone are enough to correctly pass the argument by reference. As of PHP 5.3.0, you will get a warning saying that „call-time pass-by-reference” is deprecated when you use & in foo(&$a);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.

 

Jak naprawić ten „błąd”?

Ampersand (referencję) stosujemy tylko podczas definicji funkcji, podczas wywoływania nie piszemy go już.