2008-08-21 18 views
15

J'utilise Apache sous Linux dans VMWare.sleep() silencieusement hogs CPU

L'une des pages PHP Je demande-t un sleep(), et je trouve que si je tente de demander une deuxième page tandis que la première page est sleep()'ing, la seconde se bloque page, en attendant la sleep() de la première page à terminer.

Est-ce que quelqu'un d'autre a vu ce comportement?

Je sais que PHP n'est pas multi-thread, mais cela semble être une mauvaise manipulation grossière de la CPU.

Modifier: J'aurais dû mentionner que l'utilisation de l'UC ne pointe pas. Ce que je veux dire par CPU "hogging" est qu'aucune autre page PHP semble capable d'utiliser le CPU alors que la page est sleep() '.

+0

Avez-vous déjà trouvé une solution pour cela? J'ai le même problème. –

Répondre

1

Est-ce que vous voyez réellement le CPU aller à 100% ou juste que d'autres pages ne sont pas servies? Combien d'instances apache courez-vous? Est-ce qu'ils s'arrêtent tous quand vous exécutez sleep() dans les threads?

La fonction sleep() de PHP passe essentiellement par une boucle inactive pendant n secondes. Il ne libère aucune mémoire, mais il ne devrait pas augmenter la charge du processeur de manière significative.

4

Cela signifie probablement que votre Apache n'utilise qu'un seul processus fils.

Par conséquent:

Le processus enfant 1 gère une demande (dans ce cas le sommeil, mais il pourrait faire un travail réel, Apache ne peut pas faire la différence), alors quand vient une nouvelle demande, il sera devoir attendre que le premier processus soit terminé. La solution serait d'augmenter le nombre de processus enfants que Apache est autorisé à générer (directive MaxClients si vous utilisez le MPM prefork), supprimez simplement sleep() du script PHP.

Sans vraiment savoir ce qu'il se passe dans votre script, c'est difficile à dire, mais vous pouvez probablement vous débarrasser de sleep().

+0

Vous avez un peu apprivoisé la notion avec le mot "probablement", mais je ne vois toujours pas comment vous pouvez justifier de pouvoir retirer des morceaux de code que vous n'avez jamais vus sans casser des choses? – JoeBloggs

+3

Je suis désolé, je n'ai pas prononcé ma remarque plus clairement. Je ne voulais pas dire que vous pouviez simplement vous débarrasser du sommeil et l'application continuerait de fonctionner. Je voulais dire que selon toute vraisemblance, sleep() n'est pas là pour une bonne raison, et l'application pourrait probablement être réécrite pour fonctionner sans le sleep(). – rix0rrr

10

Il se peut que la page appelée ouvre une session et ne la valide pas, dans ce cas, voir this answer pour une solution.

+4

Si php.ini est configuré avec session.auto_start défini sur 1, il ouvrira la session avant d'exécuter le code et le restera ouvert jusqu'à ce que vous le fermiez explicitement ou que la page atteigne la fin. La deuxième requête semblera suspendre avant même d'avoir exécuté la première ligne de code. –

+2

Dans mon cas, l'appel 'session_write_close()' avant de commencer la boucle a empêché 'sleep' de bloquer l'accès aux autres pages sur le serveur. – thirdender