2009-08-07 7 views
17

Il modulo APC in PHP durante l'esecuzione in modalità CLI supporta l'ottimizzazione del codice? Ad esempio, quando eseguo un file con php -f <file> il file verrà ottimizzato con APC prima dell'esecuzione o meno? Presumendo che APC sia impostato per il caricamento nel file di configurazione. Inoltre, saranno ottimizzati anche gli script inclusi con require_once?PHP APC in modalità CLI

So che l'ottimizzazione funziona correttamente quando si esegue in modalità fastcgi, ma mi chiedo se funzioni anche in CLI.

Le funzioni di apc_ * funzionano, ma mi chiedo dell'ottimizzazione del codice, che è la cosa principale che sto cercando qui.

giorno Felice, Matic

risposta

24

La documentazione di apc.enable_cli, che controllano se APC dovrebbe essere attivato in modalità CLI, dice (citando):

lo più per il test e il debug. Impostando questo si abilita APC per la versione CLI di PHP. In normali circostanze, non è l'ideale per creare, popolare e distruggere la cache APC a ogni richiesta CLI, ma per vari scenari di test è utile essere in grado di abilitare APC per la versione CLI di PHP facilmente.

Forse APC memorizzerà gli opcode in memoria, ma mentre l'eseguibile PHP muore alla fine dello script, quella memoria andrà persa: non si manterrà tra le esecuzioni dello script.

Quindi l'opcode-cache in APC è inutile in modalità CLI: non ottimizzerà nulla, poiché PHP dovrà ancora ricompilare il codice sorgente in opcode ogni volta che viene lanciato l'eseguibile di PHP.


In realtà, APC non "ottimizzare": il modo standard di esecuzione di uno script PHP è come questo:

  • leggere il file, e compilare in codici operativi
  • eseguire i codici operativi

Cosa APC è conservare in codici operativi a memoria, quindi l'esecuzione di uno script PHP diventa:

  • leggere i codici operativi dalla memoria (molto più veloce di compilazione del codice sorgente)
  • eseguire i codici operativi

Ma questo significa che è necessario avere qualche posto in memoria per memorizzare i codici operativi. Quando si esegue PHP come un modulo Apache, Apache è responsabile della persistenza di quel segmento di memoria ... Quando PHP viene eseguito da CLI, non c'è nulla per mantenere il segmento di memoria lì, quindi viene distrutto al termine dell'esecuzione di PHP.
(non so come funziona esattamente, ma è qualcosa di simile, almeno nei principi, anche se le mie parole non sono molto "tecnico" ^^)


Oppure, per "ottimizzazione" intendi qualcos'altro rispetto alla cache opcode, come la direttiva di configurazione apc.optimization? Se è così, questo è stato rimosso in APC 3.0.13

+0

Dalla documentazione PHP: APC è una struttura libera, aperta e robusta per caching e ottimizzazione PHP codice intermedio. Indovinate mi chiedo sull'ottimizzazione del codice intermedio. Ho intenzione di eseguire lo script CLI solo una volta e poi funzionerà per alcuni giorni, eseguendo del codice all'interno di un ciclo. Quindi APC non velocizza realmente l'esecuzione stessa, solo il tempo necessario per iniziare l'esecuzione? – Matic

+0

http://pecl.php.net/package-info.php?package=APC&version=3.0.13 dice "Obsoleto e rimuovi apc optimizer"; Non ho mai sentito APC (almeno nelle ultime versioni) ha fatto alcun tipo di "ottimizzazione" come quello che si può pensare al compilatore può fare quando si programma in C. E non penso che ridurrà il tempo preso per iniziare l'esecuzione, dato che il PHP dovrà essere compilato in opcode (è su questa parte che APC consente un enorme guadagno ... Quando può tenere quegli opcode in memoria tra le esecuzioni della sceneggiatura - che non penso può fare in CLI) –

+0

Giusto per essere chiari, l'utilizzo di APC in modalità CLI è ancora abbastanza utile per la memorizzazione nella cache di oggetti generati dall'utente. In uno script su cui sto lavorando, usiamo apc_store() e apc_fetch() per sfruttare il caching degli oggetti utente di APC in un cron job di lunga durata. – rinogo

3

Beh, c'è una buona ragione per APC in modalità CLI: unit testing: voglio fare il mio test di unità utilizzando un ambiente il più vicino all'ambiente di produzione in seguito come possibile. Zend Framework ha una soluzione di caching interna, che può usare la cache variabile di APC come back-end di archiviazione - e voglio usarlo.

+0

Penso che in questo caso potresti voler esaminare un altro back-end per il test dell'unità. Per fortuna, questo è inseribile in Zend_Cache. – Till

+0

Lo so, ma quei backend non si comportano esattamente nello stesso modo. Pertanto mi piacerebbe fare Unittests con lo stesso backend. – Laph

3

Se si dispone di codice CLI che genera alcuna configurazione in base all'ambiente, quindi il codice CLI penserà che APC non è abilitato. Ad esempio, quando si genera il contenitore DI di Symfony attraverso la CLI, dirà a Doctrine di non usare APC (details).

Inoltre, non l'ho provato ma c'è una possibilità che APC possa migliorare la velocità degli script per i file inclusi dopo un pcntl_fork(). Modifica: ho posto la domanda su APC & pcntl_fork() here.

Per completezza, per consentire APC sulla CLI (in Ubuntu):

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