2009-08-07 13 views
17

Czy moduł APC w PHP działa podczas optymalizacji kodu w trybie CLI? Na przykład, kiedy uruchomię plik z php -f <file>, czy plik zostanie zoptymalizowany za pomocą APC przed wykonaniem, czy nie? Zakładając, że APC jest ustawiony na ładowanie w pliku konfiguracyjnym. Czy skrypty zawarte w require_once będą również zoptymalizowane?PHP APC w trybie CLI

Wiem, że optymalizacja działa dobrze podczas pracy w trybie fastcgi, ale zastanawiam się, czy działa również w CLI.

apc_ * funkcje działają, ale zastanawiam się nad optymalizacją kodu, która jest najważniejsza dla mnie tutaj.

Szczęśliwy dzień, Matic

Odpowiedz

24

Dokumentacja apc.enable_cli, które kontrolują, czy APC powinna być aktywowana w trybie CLI mówi (cytowanie):

głównie do testowania i debugowania. Ustawienie to włącza APC dla wersji PHP CLI . W normalnych okolicznościach, nie jest idealny do tworzyć, wypełniać i zniszczyć pamięci podręcznej APC na każde żądanie CLI, ale dla różnych scenariuszy testowych warto móc włączyć APC dla wersji PHP CLI łatwo.

Może APC zapisze kody operacji w pamięci, ale ponieważ plik wykonywalny PHP zginie na końcu skryptu, pamięć zostanie utracona: nie będzie trwała między wykonaniem skryptu.

Tak więc pamięć podręczna kodu w APC jest bezużyteczna w trybie CLI: nie będzie optymalizować niczego, ponieważ PHP będzie musiało ponownie skompilować kod źródłowy do kodu opcodu przy każdym uruchomieniu pliku wykonywalnego PHP.


Właściwie APC nie „optymalizacji”: standardowym sposobem wykonywania skryptu PHP jest tak:

  • odczytać pliku i skompilować go pod rozkazy
  • wykonać opcodes

Co APC jest sklep w opcodes w pamięci, więc wykonanie skryptu PHP staje:

  • przeczytać opcodes z pamięci (znacznie szybciej niż kompilacji kodu źródłowego)
  • wykonać opcodes

Ale to oznacza, że ​​musisz mieć pewne miejsce w pamięci do przechowywania opcodes. Kiedy PHP działa jako moduł Apache, Apache jest odpowiedzialny za utrzymywanie tego segmentu pamięci ... Gdy PHP jest uruchamiane z CLI, nie ma tam nic, co by zatrzymywało segment pamięci, więc jest niszczone pod koniec wykonywania PHP.
(nie wiem dokładnie jak to działa, ale jest coś w tym, co najmniej w zakresie zasad, nawet jeśli moje słowa nie są bardzo „techniczny” ^^)


Albo przez "optymalizacja" oznacza coś innego niż pamięć podręczna opcode, np. dyrektywa konfiguracyjna apc.optimization? Jeśli tak, ta została usunięta w APC 3.0.13

+0

z dokumentacji PHP APC jest wolny, otwarte i solidne ramy do buforowania i optymalizacji kodu PHP pośredni. Zgadnij Zastanawiam się nad optymalizacją kodu pośredniego. Planuję wykonanie skryptu CLI tylko raz, a następnie będzie on działał przez kilka dni, wykonując kod wewnątrz pętli. Więc APC tak naprawdę nie przyspiesza samego wykonania, tylko czas potrzebny na rozpoczęcie wykonywania? – Matic

+0

http://pecl.php.net/package-info.php?package=APC&version=3.0.13 mówi "Przestarzałe i usuń optymalizator apc"; Nigdy nie słyszałem, żeby APC (przynajmniej w ostatnich wersjach) robił jakąkolwiek "optymalizację", jak to, co mógłbyś pomyśleć o kompilerze, który możesz zrobić, gdy programujesz w C. Nie sądzę, że to zmniejszy czas wzięty, aby zacząć wykonywanie, ponieważ PHP będzie musiało być skompilowane do opcode'a (to właśnie na tej części APC pozwala na ogromny zysk ... Kiedy może zachować te kody w pamięci pomiędzy wykonaniami skryptu - co nie wydaje mi się może to zrobić w CLI). –

+0

Po prostu, aby było jasne, używanie APC w trybie CLI jest nadal bardzo przydatne do buforowania obiektów generowanych przez użytkownika. W skrypcie, nad którym pracuję, używamy apc_store() i apc_fetch(), aby wykorzystać buforowanie obiektów użytkowników APC w długo działającym zadaniu cron. – rinogo

3

dobrze, nie jest dobrym powodem do APC w trybie CLI: test jednostkowy: Chcę zrobić mój test jednostki za pomocą środowiska tak blisko późniejszym środowisku produkcyjnym jako możliwy. Zend Framework ma wewnętrzne rozwiązanie do buforowania, które może wykorzystywać zmienną pamięć podręczną APC jako Backend pamięci - i chcę to wykorzystać.

+0

Myślę, że w tym przypadku możesz zajrzeć do innego zaplecza do testowania jednostkowego. Dobrze, że można to podłączyć w Zend_Cache. – Till

+0

Wiem, ale te Backendy nie zachowują się dokładnie tak samo. Dlatego chciałbym robić Unittests z tym samym backendem. – Laph

3

Jeśli masz kod, który generuje CLI dowolną konfigurację opartą na środowisko, a następnie kod CLI będą myśleć, że nie jest APC włączony. Na przykład, podczas generowania kontenera DI Symfony za pośrednictwem interfejsu CLI, program poinformuje Doctrine, aby nie używała APC (details).

Nie przetestowałem tego, ale istnieje szansa, że ​​APC może poprawić szybkość skryptów dla plików zawartych po pcntl_fork(). Edycja: zadałem pytanie dotyczące APC & pcntl_fork() here.

Dla uzupełnienia, w celu umożliwienia na APC (w Ubuntu CLI)

echo 'apc.enable_cli = 1' > /etc/php5/cli/conf.d/enable-apc-cli.ini 
Powiązane problemy