Przyspieszyć cake 1.1.x

Przy okazji usprawnień dla portalu dobrzemieszkaj.pl i zabawy z xdebug.profiler udało mi się znaleźć ciekawe wąskie gardło w cakePHP.
Niestety jego usunięcie wymaga ingerencji w core frameworku, ale z uwagi na to, że wersja 1.1 nie będzie już rozwijana, a do tego przy tak zaawansowanym poziomie prac nad portalem na pewno nie będziemy migrować do żadnej innej nowiści – uważam, że można było sobie pozwolić na grzebanie w core.

O co chodzi?
Konstruktor modelu wywołuje metodę Model::setSource(), która przede wszystkim sprawdza, czy wśród wszystkich tabel jest ta, z którą powiązany jest dany model. W portalu na stronie głównej było ok 50 wywołań konstruktorów modeli, a co za tym idzie- również Model::serSource.

Wszystko byłoby w porządku, gdyby nie to, że ta funkcja zabezpiecza się przed przypadkiem niestosowania się w 100% do konwensji cake. Dlatego wszystkie elementy (nazwy tabel) traktowała funckją strtolow().

Z uwagi na to, że w naszym projekcie jest 150 tabel, to przebiegnięcie po tablicy 150 stringów i zamiana na lowercase odbywała się 50 razy, czy razem było  750 stringów było zamienianych na lowercase. Sęk w tym, że operacja nie była potrzebna, gdyż wszystkie nasze tabele są lowercase.
Dlatego dobrą opcją było zamiana cake/libs/model/model_php5.php:523 z

if (is_array($sources) && !in_array(low($prefix . $tableName), array_map('low', $sources))) {

na

if (is_array($sources) && !in_array($prefix . $tableName,  $sources)) {

proste jak budowa cepa, a ubyło kolejne ćwierć sekundy na generowanie strony :)

W prawdzie nie jest to oszołamiające przyspieszenie, ale przy bardzo wielu zapytaniach na raz – przydatne.

Edit: członkini teamu cake Jitka Koukalova potwierdziła, że ten fragment kodu jest obejściem, dzięki któremu cake działa również z php4. Twierdzi też, że to jeden z wielu elementów, bez których cakePHP będzie działał szybciej, ale tylko na php5.

You discovered one of many workarounds which are necessary for PHP4.
It is just one of many things which will make PHP5 only CakePHP much
faster.

Nic tylko dalej szukać i usprawniać ;)

Share Button

HttpSocket z cake 1.2 w cake 1.1.x

Jeśli potrzebujesz funkcjonalności zapewnianej przez HttpSocket(na przykład musisz pracować na danych w xml-u dostarczanych choćby przez kanał rss), a z jakichś powodów nie możesz korzystać/migrować na CakePhp1.2, zastosuj poniższą sztuczkę:

Z biblioteki CakePhp1.2 (cake/libs/) do katalogu vendors w Twojej aplikacji (1.1.x) skopiuj pliki
– socket.php
– http_socket.php

W pliku socket.php gdzieś na początku, przed definicją klasy jest linia
uses(‘validation’);
zakomentuj ją (lub usuń) .
Z kolei w pliku http_socket.php linię
uses( ‘socket’, ‘set’);
Zamień na
vendor(‘socket’);
uses(‘set’);

Sposób działający pomiedzy wersją 1.2.0.6311 beta a 1.1.16.5421.
Powodzenia

Uwaga: działa jedynie przy zapytaniach GET. Dla POST brakuje potrzebnych klas i trzeba by nieco pogrzebać w kodzie HttpSocket, żeby można było wywoływać zapytania POST.

Share Button