mcrypt_create_iv teilweise sehr langsam

Für ein privates Projekt bastle ich seit einiger Zeit an einem IRC-Bot wobei folgendes Problem auftrat: Sobald Nachrichten in einem IRC-Channel gelesen oder geschrieben wurden hing das Script für einige Sekunden als würde irgendwo ein sleep ausgeführt. Dies war allerdings nicht immer der Fall und trat zudem nicht auf einem Windows System auf. (Weshalb mein Xdebug-Profiling erfolglos war). Es blieb mir also nichts anderes übrig als solange Komponenten des Bots zu deaktivieren bis das Problem nicht mehr auftrat. So stelle ich fest dass, das Problem irgendwo in der Klasse für die FiSH-Verschlüsselung lag.

Bei genauerer Analyse stelle sich heraus dass die Funktion mcrypt_create_iv aus der Mcrypt-Extension Ursache des Problems war. Diese Funktion generiert eine Initialisierungsvektor für die Ver-/Entschlüsselung und braucht dafür teilweise extrem lange. In meinem Fall 5-6 Sekunden. Eine Lösung für das Problem fand ich auf php.net: Statt MCRYPT_DEV_RANDOM kann man MCRYPT_DEV_URANDOM als Quelle für die benötigen Zufallswerte benutzen und das Problem ist behoben. Ein simple Änderung mit großer Wirkung.

Vorher:

$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);

Nacher:

$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM);