Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1

    [PERFORMANCE] come avete risolto con INCLUDE_ONCE?

    come spero saprete, include_once rallenta di molto l'esecuzione degli script, soprattutto quando la quantità degli include cresce.

    ho trovato svariate soluzioni in giro e personalmente ho creato una funzione con una variabile statica dove sono registrati gli script che voglio includere. quando la chiamo, lei controlla che lo script non sia già stato incluso. percui, il tutto e' ridotto ad un IF.

    voi che soluzione adottate?
    si vivono molte vite e si muore una volta sola

  2. #2
    Sei davvero sicuro che il tuo metodo sia realmente più veloce?

  3. #3
    Originariamente inviato da filippo.toso
    Sei davvero sicuro che il tuo metodo sia realmente più veloce?
    In effetti pensavo anch'io fosse una sorata (presentato senza fonti è quasi matematico) e invece:

    Codice PHP:
    // b.php è un file vuoto
    $included = array();

    $start microtime(true);
    for (
    $n 0$n 50000; ++$n) {
        include_once 
    'b.php';
    }
    $time microtime(true) - $start;
    echo 
    "include_once = $time secondi\n";

    $start microtime(true);
    for (
    $n 0$n 50000; ++$n) {
        if (!
    in_array('b.php'$included)) {
            
    $included[] = 'b.php';
            include 
    'b.php';
        }
    }
    $time microtime(true) - $start;
    echo 
    "naive approach = $time secondi\n"
    Questo il risultato:

    codice:
    include_once = 0.33409905433655 secondi
    in_array = 0.041491985321045 secondi
    Indagando un pelo, mi scopro che include_once accede sempre al file system per verificare la presenza del file, anche quando è già stato incluso.

    Codice PHP:
    // b.php è un file vuoto
    include_once 'b.php';
    unlink('b.php');
    include_once 
    'b.php'
    Risultato atteso: niente. Risultato ottenuto:

    codice:
    PHP Warning:  include_once(b.php): failed to open stream: No such file or directory in /home/nicola/tmp/a.php on line 5
    PHP Warning:  include_once(): Failed opening 'b.php' for inclusion (include_path='.:/usr/lib64/php') in /home/nicola/tmp/a.php on line 5
    Molto male...

  4. #4
    Originariamente inviato da ntd


    Codice PHP:
    // b.php è un file vuoto
    include_once 'b.php';
    unlink('b.php');
    include_once 
    'b.php'
    Risultato atteso: niente. Risultato ottenuto:

    codice:
    PHP Warning:  include_once(b.php): failed to open stream: No such file or directory in /home/nicola/tmp/a.php on line 5
    PHP Warning:  include_once(): Failed opening 'b.php' for inclusion (include_path='.:/usr/lib64/php') in /home/nicola/tmp/a.php on line 5
    Molto male...
    forse a causa del fatto che hai cancellato il file
    e alla seconda chiamata giustamente php si incavola perchè non trova il file che cerchi

    in ultima nota che il caricamento dei dati caricati dal disco risulti più lento di quello da un array in memoria è rispauto è sempre stato così ed è dovuto alle diverse velocità di accesso tra ram e hdd.
    Never care for what they say, Never care for games they play. Never care for what they do, Never care for what they know.
    «Solo due cose sono infinite: l’universo e la stupidità umana, e sul primo non sono sicuro». (A. Einstein)

  5. #5
    Originariamente inviato da soichiro
    forse a causa del fatto che hai cancellato il file
    Rileggi il thread, per cortesia.

  6. #6
    Originariamente inviato da ntd
    Rileggi il thread, per cortesia.
    scusa ma il tuo codice che ho riportato fà nell'ordine:
    1 include il file b.php
    2 cancella il file b.php
    3 include nuovamente il file b.php

    mi sembra ovvio che php si incazzi se richiami un file cancellato e quindi inesistente.

    per quanto riguarda le inclusioni basta limitarsi ad usarle solo quando necessario e magari a ridurne il numero usando un solo file o al massimo 2
    Never care for what they say, Never care for games they play. Never care for what they do, Never care for what they know.
    «Solo due cose sono infinite: l’universo e la stupidità umana, e sul primo non sono sicuro». (A. Einstein)

  7. #7
    Originariamente inviato da soichiro
    scusa ma il tuo codice che ho riportato fà nell'ordine:
    1 include il file b.php
    2 cancella il file b.php
    3 include nuovamente il file b.php
    ...
    Non è proprio così. Si stava discutendo delle performance di include_once: questo comando non include solamente il file, altrimenti avrei usato include, ma lo include SE non è già stato incluso.

    In altri termini, al punto 3 b.php è già incluso, ergo mi aspetto che include_once non faccia niente. Invece accede ancora al file system per verificare la presenza di b.php. Il fatto che sia un approccio giusto è fortemente opinabile.

    Con il seguente stralcio di codice che ho usato nell'esempio precedente:

    Codice PHP:
        if (!in_array('b.php'$included)) {
            
    $included[] = 'b.php';
            include 
    'b.php';
        } 
    simulo il comportamento di include_once SENZA accedere al file system e, con mia sorpresa, le performance sono migliori.

  8. #8
    ma ... dico io ... invece di cercarsi ASSURDE e considerevolmente ASSURDE soluzioni ... LOL ... perché non leggere il manuale???

    a parte che è organizzativamente e strutturalmente sbagliato includere più volte un file, ma è normale che se cancelli il file ricevi errore per il semplice motivo che puoi includere b.php, cambiarne il contenuto, e reincluderlo e siccome php è un linguaggio di scripting che viene compilato a run-time ad ogni esecuzione, è normale che controlli ogni volta il disco

    in ogni caso
    http://it2.php.net/manual/en/functio...uded-files.php

    penso che questo potrebbe essere meglio
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  9. #9
    ho sbagliato nell'interpretazione del codice
    il comportamento di include_once forse è dovuto a scelte di programmazione relative a stabilità o sicurezza
    oppure hai trovato un baco in php

    per la velocità sembra essere proprio molto più lento, però nel test che hai proposto (sempre se non sbaglio, nel caso chiedo pietà causa maratona programmazione e sonno pazzesco) cerchi di includere 50.000 volte il file, e non mi sembra un operazione tanto comune.
    se esegui l'inclusione una volta solo ottieni risultati simili:

    Codice PHP:
    nclude 0.0005648136138916 secondi 
    naive approach 
    0.00049519538879395 secondi 
    modificando il tuo codice per calcolare l'accesso al file singolo così :

    Codice PHP:
    $included = array();

    $start microtime(true);

        include_once 
    'b.php';

        
    $time microtime(true) - $start;
    echo 
    "include_once = $time secondi\n";
    unset (
    $time);
    $start microtime(true);

        if (!
    in_array('b.php'$included)) {
            
    $included[] = 'b.php';
            include 
    'b.php';
        }

    $time microtime(true) - $start;
    echo 
    "naive approach = $time secondi\n"
    trovo inutile eseguire del codice da benchmarking che poi non ha un'applicazione reale.
    una cosa che trovo inoltre abbastanza deleteria in uno script php includere tante volte lo stesso file, basta usare l'accortezza di includere tutti i file necessari ad inizio pagina/script per evitare di ripetere e/o perdere tempo successivamente .
    Never care for what they say, Never care for games they play. Never care for what they do, Never care for what they know.
    «Solo due cose sono infinite: l’universo e la stupidità umana, e sul primo non sono sicuro». (A. Einstein)

  10. #10
    Originariamente inviato da daniele_dll
    ma ... dico io ... invece di cercarsi ASSURDE e considerevolmente ASSURDE soluzioni ... LOL ... perché non leggere il manuale???

    a parte che è organizzativamente e strutturalmente sbagliato includere più volte un file, ma è normale che se cancelli il file ricevi errore per il semplice motivo che puoi includere b.php, cambiarne il contenuto, e reincluderlo e siccome php è un linguaggio di scripting che viene compilato a run-time ad ogni esecuzione, è normale che controlli ogni volta il disco

    in ogni caso
    http://it2.php.net/manual/en/functio...uded-files.php

    penso che questo potrebbe essere meglio


    non avevo letto questa risposta che condivido in pieno
    Never care for what they say, Never care for games they play. Never care for what they do, Never care for what they know.
    «Solo due cose sono infinite: l’universo e la stupidità umana, e sul primo non sono sicuro». (A. Einstein)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.