sql >> Databáze >  >> RDS >> Mysql

Zdá se, že PHP foreach user script způsobí, že Apache zamrzne

Toto chování zní jako zamykání relace. Výchozí způsob, jakým PHP sessions fungují, je uzamknout relaci (aby se zabránilo zápisu dvou procesů do objektu session). To je normálně v pořádku pro typické krátkotrvající PHP skripty, ale může vás kousnout, když máte něco, co je dlouho spuštěné.

Pokud vaše aplikace vůbec nepoužívá relace, měli byste vypnout session.auto_start v php.ini nebo .htaccess:http ://www.php.net/manual/en/session.configuration.php#ini.session.auto-start (Pokud ho tam nevidíte nebo je již vypnutý, ale používáte nějaký druh frameworku, může za vás framework spouštět relaci; pokud ano, je jednodušší přejít k dalšímu řešení, než se snažit bojovat rámec.)

Pokud relaci používáte na některých stránkách, ale ne na tomto dlouhotrvajícím procesu, řešením je ukončit relaci na začátku skriptu pomocí session_write_close() :

<?
set_time_limit(0);

require '../connect.php';
require '../includes/ses.php';

session_write_close();

$i = 1;
....

Opět varování rámce:pokud vám framework zahajuje relaci, vložte session_write_close(); po zahrnutí souborů frameworku, ne dříve! (Ve svých komentářích jste uvedl, že tomu tak bylo, a proto jsem to umístil za požadované řádky.)

Pokud váš dlouho běžící proces potřebuje použít relaci, ale pouze pro čtení, výše uvedené stále funguje. Viz https://stackoverflow.com/a/14409902/841830 (Jak ukazuje tato odpověď, pokud potřebujete napsat do relace na konci dlouhotrvajícího procesu, je to také možné.)

(P.S. Toto už bylo zodpovězeno v komentářích, ale vzal jsem Wrikkena na jeho nabídku zveřejnit to jako odpověď. Ano, fámy jsou pravdivé:Udělám cokoliv za pár opakování...)




  1. Osvědčené postupy:.NET:Jak vrátit PK proti databázi Oracle?

  2. Yii2:jak zadat schémata vícenásobné databáze?

  3. Uživatelé aplikace MySQL vs uživatelé databáze

  4. MariaDB DAY() Vysvětleno