Help! Mijn PHP cli code stopt met de melding ‘Killed’ in Docker

Voor een project moest ik onlangs een stukje code schrijven dat via SOAP een behoorlijk grote dataset moest ophalen, verwerken en in een database moest opslaan. Om zowel op kantoor als thuis gemakkelijk te kunnen ontwikkelen had ik besloten om een ontwikkelomgeving op te zetten in Docker.

In eerste instantie testte ik mijn code met kleinere datasets. Alles leek prima te werken, totdat de code klaar was om te testen met de grote datasets. Op de één of andere manier werd mijn code, die command line draaide, afgebroken met de melding Killed.

Na wat Googlen leek het erop dat ik meer geheugen gebruikte dan er beschikbaar was. Veel zoekresultaten gaven aan dat het een veel voorkomend probleem was dat er geen soapruimte meer was op de schijf. Hierop besloot ik in de code op verschillende punten wat geheugen vrij te maken. In eerste instantie leek dit de oplossing, want ik kreeg de melding niet meer en de code liep prima door. Echter, na verder uitbreiding kreeg ik toch weer de killed melding.

Nu ontwikkel ik op een laptop met een 256GB schijf en 16GB RAM, dus het leek me toch onwaarschijnlijk dat ik onvoldoende resources zou hebben. Dit bracht me op het idee om toch eens in de Docker settings te gaan neuzen.

Toen bleek dat Docker inderdaad instellingen heeft voor de te gebruiken resources. Het probleem bleek eenvoudig op te lossen door de swapruimte te verhogen. De standaardwaarde voor de swapruimte is 1GB. Nadat ik deze verhoogd heb naar 3,5GB heeft het probleem zich niet meer voorgedaan.

Maak je WordPress plugin beschikbaar via Composer

composer

Composer wordt steeds vaker gebruikt om allerlei PHP-libraries te installeren. Ik maak er in mijn projecten volop gebruik van. In plaats van zelf het wiel opnieuw uit te vinden, zoek je even op Packagist naar een composer-package die de functionaliteit bevat die je nodig hebt voor je project. Als je het gewenste pakket gevonden hebt, is installatie via Composer een eitje.

Inmiddels heb ik ook enkele projecten beschikbaar gesteld aan de open-source community, zoals een ShopConnectors library, een client voor Domoticz, een client voor NanoPool en een SMS-client.

Een tijdje geleden schreef ik ook een WordPress plugin om de statistieken van je ethOS-miner op je site weer te geven. Deze plugin is via WordPress.org te downloaden en daardoor eenvoudige via de WordPress backoffice te zoeken en te installeren. Toch begon ik me af te vragen of het niet mogelijk zou zijn om WordPress plugins via Composer te installeren. Dat bleek inderdaad te kunnen. Het is zelfs erg eenvoudig.

In de map van je plugin hoef je alleen maar een composer.json bestand toe te voegen. In de composer.json moet je aan een paar voorwaarden voldoen. Hieronder een voorbeeld van wat er in de composer.json van mijn ethOS Statistics Plugin for WordPress moest komen:

{
  "name": "rutgerkirkels/ethos-statistics",
  "type": "wordpress-plugin",
  "require": {
    "composer/installers": "v1.0.6"
  }
}

Zoals je hierboven kunt zien, met je aangeven dat het type WordPress-plugin is. Tevens moet composer/installers als requirement toegevoegd worden. Hierdoor wordt de plugin niet standaard in de vendors directory geïnstalleerd zoals dat bij Composer-packages gebruikelijk is, maar in de wp-content/plugins directory van je WordPress installatie.

Het enige dat je nu nog hoeft te doen, is de plugin te activeren in je WordPress backoffice.

E-mail ondertekenen met PHP

digital-signature

Het digitaal ondertekenen en versleutelen van e-mails voorkomt het onderscheppen, lezen en wijzigen van e-mails door derden. Het geeft de ontvanger de garantie dat het bericht ongewijzigd en van jou afkomstig is. Als de ontvanger ook een certificaat heeft, kun je versleutelde e-mail verzenden waardoor deze alleen voor de ontvanger te lezen is.

Ik gebruik deze functionaliteit al geruime tijd en eerlijk gezegd was ik verbaasd dat het nog geen standaard praktijk is geworden voor bedrijven. Het zou het phishing-probleem volgens mij grotendeels oplossen.

Onlangs kreeg ik de vraag of dit ook op een webserver mogelijk zou zijn, bijvoorbeeld bij het geautomatiseerd versturen van e-mail. Hierop besloot ik dit eens uit te zoeken. Het blijkt nog niet eens zo moeilijk om dit in PHP te realiseren.

Stap 1: Een certificaat verkrijgen

Een e-mail certificaat kun je bij verschillende aanbieders aanschaffen. Er zijn ook aanbieders van gratis e-mail certificaten en Comodo is zo’n aanbieder van gratis e-mail certificaten. Het certificaat dat zij aanbieden is 1 jaar geldig. Daarna moet er een nieuw certificaat aangeschaft worden. Ik heb het certificaat gedownload op een MacBook met de Safari webbrowser. Na het volgen van de instructies werd er een bestand, genaamd CollectCC.p7s gedownload.

Stap 2: Het certificaat exporteren

Wanneer je op dit bestand klikt, vraagt MacOS of certificaten in dit bestand moeten worden toegevoegd aan de sleutelhanger-applicatie op de Mac. Klik hier op Voeg toe. Je hoeft in dit venster verder niets in te stellen. Op nu de sleutelhanger-applicatie en selecteer aan de linkerzijde Mijn Certificaten.

keychain_certificates

Klik nu met de rechter muisknop (of CTRL-klik) op het certificaat en kies de optie Exporteer sleutel.

keychain_certificate_p12

Geef het bestand een naam die je gemakkelijk kunt onthouden, bijvoorbeeld emailcertificate. Kies Personal Information Exchange (.p12) als bestandsstructuur. Wanneer je nu op Bewaar klikt, wort je gevraagd een wachtwoord in te voeren waarmee het geëxporteerde certificaat wordt beveiligd.

Stap 3: Spiltsen naar certificaat en private sleutel

Hiervoor open je de Terminal, aangezien we de volgende commando’s command-line gaan uitvoeren. Eerst gaan we de private sleutel maken:

openssl pkcs12 -in emailcertificate.p12 -nocerts -out <emailadres>.key

Vervang <emailadres> door het mailadres waarvoor het certificaat was aangemaakt. Na het uitvoeren van dit commando wordt je eerst gevraagd om een wachtwoord om te importeren. Dit is het wachtwoord dat je hebt opgegeven bij het exporteren vanuit de sleutelhanger-applicatie. Vervolgens moet je (tweemaal) een wachtwoord ingeven waarmee je je private sleutel wilt beveiligen.

Hierna gaan we het certificaat aanmaken met het volgende commando:

openssl pkcs12 -in Certificaten.p12 -clcerts -nokeys -out <emailadres>.crt

Ook hier moet je weer het import-wachtwoord invoeren.

We hebben nu twee bestanden gecreëerd: <emailadres>.key en <emailadres>.crt

Stap 4: De code

Voor het versturen van de mail, gaan we nu een stukje PHP-code schrijven. Natuurlijk kunnen we alle code zelf schrijven, maar ik heb er voor gekozen om gebruik te maken van PHPMailer, die een hoop werk al voor ons doet. PHPMailer is eenvoudig te installeren via Composer:

composer require phpmailer/phpmailer

Nadat we PHPMailer gedownload en geïnstalleerd hebben, gaan we de code schrijven:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

//Laad composer's autoloader
require 'vendor/autoload.php';

$mail = new PHPMailer(true);
try {
$mail->SMTPDebug = 2;
$mail->Host = '<hostname_van_je_stmp_server>';

$mail->setFrom('<email_adres_van_je_certificaat>', '<naam_van_de_verzender>');
$mail->addAddress('<email_adres_van_de_ontvanger>', '<naam_van_de_ontvanger>');

$mail->isHTML(true);
$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->sign(
__DIR__.'/<emailadres>.crt', //De locatie van je certificaat bestand
__DIR__.'/<emailadres>.key', //De locatie van je private sleutel bestand
//Het onderstaande wachtwoord is het wachtwoord van je private sleutel, NIET het import-wachtwoord!
'<wachtwoord_van_je_private_sleutel>'
);

$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
?>

Als alles goed gegaan is, krijg je nu een ondertekende mail binnen:

signed_email