1311 private links
Neat.
Enqueue is production ready, battle-tested messaging solution for PHP. Provides a common way for programs to create, send, read messages.
Supports major brokers such as RabbitMQ, Kafka, Amazon SQS, Google PubSub, Redis etc.
Le préchargement de fichier en PHP a l'air prometteur, avec des gains de performances ~15% sur les premiers benchmarks. Avec un préchargement automatique via composer, ça pourra devenir intéressant pour certains usages ; en particulier des micro-services qui doivent gérer un volume important de requêtes.
Pas mal de trucs intéressants !
Notamment niveau simplification de syntaxe, on a
- Short closures for cleaner one-liner functions
array_map(function (User $user) {
return $user->id;
}, $users);
// peut s'écrire
array_map(fn(User $user) => $user->id, $users);
- Null coalescing assignment operator
$data['date'] = $data['date'] ?? new DateTime();
// peut s'écrire
'date'] ??= new DateTime();
Une bibliothèque simple en PHP pour la gestion des adresses IP, avec tout un tas de helpers.
Ça sert toujours, et en plus elle supporte Doctrine.
Static analysis tools for PHP
(liste)
Une bibliothèque PHP qui permet de charger le DOM, et propose ensuite une API comprenant les sélecteurs jQuery, les requêtes XPath, etc.
Ce lien est à garder bien au chaud : une longue liste de bibliothèques PHP pour tous les usages, du Framework au HTML purifier en passant par le parser d'URL.
J'ai eu quelques soucis avec Travis CI pour des tests de bout en bout d'un outil qui manipule des images en PHP.
En gros, j'ai :
- un dossier avec des images attendues
- un dossier avec les images sources
- des tests unitaires qui passent les images sources dans la moulinette, et s'assurent qu'elles ressortent identiques aux images attendues.
Tout marchait bien en local, mais lors de l'exécution des tests Travis, toutes les images étaient différentes. À l’œil nu, c'était bien les même, mais les binaires n'étaient pas identiques.
Il s'avère qu'il suffit d'avoir une version légèrement différente de php-gd
pour que les images générées soient différentes, par exemple une amélioration de l'encodage. Merci cet article du blog de Piwik pour m'avoir mis sur la piste.
De fait, la solution est assez simple : recréer à la volée les images attendues avec PHP GD (et donc la même version que celle utilisée par la moulinette). Attention, il faut bien ré-utiliser toutes les fonctions utilisée dans la manipulation des images pour arriver au bon résultat.
En bonus, un petit snippet :
/**
* Duplicate expected images using the current GD version.
*
* Different versions of GD will result in slightly different images,
* which would make the comparaison test fail. By regenerating expected thumbs,
* the expected and actual result should be the same.
*
* @param string $image relative path of the expected thumb inside the expected thumb directory.
* @param bool $crop Set to true to apply the crop function.
*
* @throws \Exception couldn't create the image.
*/
public function regenerate($image, $crop = false)
{
$targetFolder = dirname(self::$regenerated . $image);
if (! is_dir($targetFolder)) {
mkdir($targetFolder, 0755, true);
}
$content = file_get_contents(self::$expected . $image);
$sourceImg = @imagecreatefromstring($content);
$width = imagesx($sourceImg);
$height = imagesy($sourceImg);
$targetImg = imagecreatetruecolor($width, $height);
if (! imagecopyresized(
$targetImg, $sourceImg,
0, 0, 0, 0,
$width, $height, $width, $height
)
) {
@imagedestroy($sourceImg);
@imagedestroy($targetImg);
throw new \Exception('Could not generate the expected image from source image.');
}
if ($crop) {
$targetImg = imagecrop($targetImg, [
'x' => 0,
'y' => 0,
'width' => $width,
'height' => $height
]);
}
$target = self::$regenerated . $image;
imagedestroy($sourceImg);
imagepng($targetImg, $target);
imagedestroy($targetImg);
}
Container is a small but powerful dependency injection container that allows you to decouple components in your application in order to write clean and testable code.
C'est bon à savoir. La fonction uniqid()
de PHP s'appuie sur l'heure. Pour éviter les collisions, elle met donc le thread en pause avec une microseconde (usleep(1)). Si vous savez un peu comment fonctionne un CPU, ça peut en fait être un peu plus, en fonction de sa fréquence, ce qu'il fait à côté, etc. Du coup, dans une boucle, une pause de ce genre peut commencer à avoir un impact non négligeable sur les performances.
Conclusion, il faut toujours appeler cette fonction avec le paramètre $more_entropy
pour éviter de passer par cette pause.
Un groupe de hacker a réussi à avoir un contrôle distant complet sur les serveurs Pornhub en découvrant deux failles 0-day sur PHP ; sachant que c'est un secteur qui ne lésine pas sur la sécurité vu que la concurrence n'est pas toujours très réglo.
Pour résumer :
Ils ont découvert qu'il était possible de définir un cookie, qui fait appel à la fonction PHP unserialize()
, via une simple requête. À partir de là, ils ont utilisé un fuzzer pour détecter d'éventuelles anomalies dans le comportement de unserialize()
. Ils en ont trouvé et, suite à analyse, ils ont découvert un bug dans l'algorithme du garbage collector de PHP.
Ce bug, appelée faille « use-after-free » (utilisation de la mémoire après qu'elle soit libérée), leur a permis d'exécuter du code à distance directement sur le serveur, via des techniques de manipulation de mémoire auxquelles je ne comprends pas tout. Et résultat des courses, ils ont pu faire un dump complet de la base de données et accès au code source de pornhub.
Sacrément balaise ! Ils ont bien mérité leur prime de $20.000.
C'était en juin, vérifiez que vos versions de PHP sont à jour.
via http://lehollandaisvolant.net/?id=20160725122057 - Rien à voir avec la gestion des fichiers par contre.
Yet another PHP CMS.
Stockage directement en fichiers, et il a de la gueule.
Intéressant. Des statistiques sur les conventions de codes appliquées sur un ensemble de projets PHP.
Globalement, je suis dans la majorité, c'est plutôt bon signe.
Une librairie/framework PHP qui prend en charge tout le système d'authentification et d'autorisations.
Ça peut permettre d'éviter d'avoir à ré-inventer la roue, et surtout d'avoir des trous dans la raquette niveau sécurité.