<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://kniebes.com/assets/xsl/rss.xsl" type="text/xsl" media="screen"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:media="http://search.yahoo.com/mrss/"
>

    <channel>
        <title>M. Kniebes. · PHP</title>
        <atom:link href="https://kniebes.com/tag/php.xml" rel="self" type="application/rss+xml" />
        <link>https://kniebes.com</link>
        <description>Beiträge zum Tag PHP</description>
        <lastBuildDate>Thu, 28 May 2026 08:34:11 +0200</lastBuildDate>
        <language>de-DE</language>
        <sy:updatePeriod>hourly</sy:updatePeriod>
        <sy:updateFrequency>1</sy:updateFrequency>
        <generator>IO</generator>
        <atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
        <atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
        <atom:link rel="hub" href="https://websubhub.com/hub"/>

                
            
            <item>
                
                <title><![CDATA[Simple Anti-FOMO RSS-Reader]]></title>
                <link>https://kniebes.com/2026/05/28/simple-anti-fomo-rss-reader.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Thu, 28 May 2026 08:34:11 +0200</pubDate>
                <guid isPermaLink="true">https://knieb.es/6a59</guid>
                <description><![CDATA[<p>Das erste Mal, dass ich ein GitHub Repo public mache. Im RSS-Club hatte ich ja schon mal angedeutet, dass ich einen einzigen RSS-Reader geschrieben habe, der per LLM FeedItem für mich nach Relevanz sortieren soll. Ich muss nicht alles lesen, was mir vor die Augen kommt. Man wird heutzutage ohnehin schon wie blöd mit News vollgepumpt. Quasi ein <a href="https://github.com/kniebes/simple-rss-reader/">Anti-FOMO RSS-Reader</a>. Der Name ist noch etwas sperrig.</p>

<p>Feature sind überschaubar:</p>

<ul>
<li>Feeds werden einer OPML-Datei entnommen, gelesen und die Items in einer MySQL Tabelle hinterlegt.</li>
<li>Wenn ein <code>ANTHROPIC_API_KEY</code> hinterlegt ist, werden neu gelesene Items mit dem <span class="nowrap">claude-haiku-4-5-20251001-Model</span> klassifiziert. Dazu wird eine Markdown-Datei mit einer Liste von Kategorien herangezogen. Diese enthält je Zeile eine Kategorie mit Schlüsselwörtern/Definition. Die Reihenfolge der Kategorien entspricht der Relevanz. Was nicht vom LLM klassifiziert werden kann, ist „Nicht kategorisiert“ und steht unten in der Liste. Das sind dann in der Regel Posts, die sich nicht mit meinem Interessenbereich decken. Bei der Klassifizierung entstehen geringfügige Kosten.</li>
<li>Neue Items können als gelesen markiert werden.</li>
<li>Alte Items werden nach 5 entsorgt. 
* Items können favorisiert werden und bleiben dann über 5 Tage hinaus behalten.</li>
</ul>

<p>Mehr gibt es noch nicht. Ich könnte mir vorstellen, die index.php zum Lesen auch wegzulassen und stattdessen das Ganze als RSS-Feed mit (soweit verfügbar) vollständigen Posts einfach nur als Feed bereitzustellen, den ich dann mit NetNewsWire lesen kann. Mal sehen …</p>

<p>Eine DDEV-Config ist im Repo enthalten.</p>

<p>Naja, es ist eher eine Art Proof of Concept als eine ernst gemeinte Anwendung. Ich denke, dass man so etwas vielleicht auch mit ein paar Klicks in Inoreader machen könnte. Aber wo bleibt denn da der Spaß.</p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=Simple Anti-FOMO RSS-Reader (knieb.es/6a59)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[Internet]]></category>
                
                    <category><![CDATA[PHP]]></category>
                
                    <category><![CDATA[RSS]]></category>
                
                    <category><![CDATA[LLM]]></category>
                
                    <category><![CDATA[Claude Code]]></category>
                
                    <category><![CDATA[Simple RSS Reader]]></category>
                                
            </item>

                            
                
            
            <item>
                
                <title><![CDATA[[RSS-Club] kleine Info zu RSS-Club-Posts]]></title>
                
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Mon, 18 May 2026 15:59:30 +0200</pubDate>
                <guid isPermaLink="false">rss-club:498f2718</guid>
                <description><![CDATA[<p>Permalink: <a href="https://kniebes.com/2026/05/18/126d44fcd6a5.html">https://kniebes.com/2026/05/18/126d44fcd6a5.html</a></p><p>Hmm… Ich schätze, ich muss die <a href="https://daverupert.com/rss-club/">RSS-Club</a>-Posts etwas kenntlicher kennzeichnen.
 
Die Feed-Items der RSS-Club-Posts haben kein <code>&lt;link&gt;</code>-Element. Ich habe mich entschieden, das Element wegzulassen, um Aggregatoren die Chance zu geben, den Item auszulassen, wenn sie keinen Link finden.</p>

<p>Im <code>&lt;description&gt;</code>-Element steht oben der etwas Permalink, dessen URL ein wenig zufälliger als gewohnt ist. So lässt sich der Post auch im Browser öffnen. Allerdings mit noindex, nofollow. </p>

<p>Und als Premiere mit diesem Post gibt es im <code>&lt;title&gt;</code>-Element nun den Prefix „[RSS-Club]“. Ich denke, das sollte ins Auge springen.</p>

<p>Aber warum überhaupt RSS-Club? Als kleines Plus für alle Leser, die den Feed abonniert haben. Somit sind hier eher Inhalte zu finden, die den Gelegenheitsbesucher vielleicht nicht übermäßig interessieren.</p>

<hr />

<p>Und sonst so? Ja, Arbeit. Lässt sich nicht vermeiden. Ich bin zwischendurch immer wieder damit beschäftigt, einer uralten Shopware-Instanz ein Upgrade von 6.4 auf 6.7 zu verpassen. Und wie es aussieht, muss das schrittweise gemacht werden. Mein Ziel ist es nun, das Ganze mit drei Deployments via <a href="https://deployer.org">deployer</a> (hübsche Startseite übrigens) zu machen. Also drei Branches mit <span class="nowrap"><em>upgrade/6.5</em></span>, <span class="nowrap"><em>upgrade/6.6</em></span> und <span class="nowrap"><em>upgrade/6.7</em></span>. Jeder Branch enthält die erforderlichen Codeänderungen und eine angepasste deploy.php, die notwendige Migrationen und Änderungen an der Shopware-Instanz vornimmt. Glücklicherweise läuft das 6.4 Unikum schon mit MariaDB 10.11, sodass kein DB-Upgrade-Hassle notwendig wird. </p>

<p>Auf dem Staging-System konnte ich heute auf diese Weise das komplette Upgrade durchführen: </p>

<pre><code class="language-bash">git checkout upgrade/6.5
dep deploy
git checkout upgrade/6.6
dep deploy
git checkout upgrade/6.6
dep deploy
</code></pre>

<p>Lässt kaum vermuten, welche nervigen Storefront- und vue.js-Änderungen der unzähligen Static-Plugins ntowenig waren. </p>

<p><strong>Gott! Ich hasse Shopware!</strong></p>

<p>Ja, und abends schlafe ich dann während einer Folge von GoT ein. Mittlerweile bin ich so schlau, direkt mit iPad im Bett zu schauen. </p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=kleine Info zu RSS-Club-Posts (knieb.es/6a4a)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHP]]></category>
                
                    <category><![CDATA[Shopware]]></category>
                
                    <category><![CDATA[Arbeit]]></category>
                
                    <category><![CDATA[Deployer]]></category>
                                
                    <category><![CDATA[RSS Club]]></category>
                
            </item>

                            
                
            
            <item>
                
                <title><![CDATA[Zeilenweise Text zum Browser streamen.]]></title>
                <link>https://kniebes.com/2026/05/14/zeilenweise-text-zum-browser-streamen.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Thu, 14 May 2026 11:43:49 +0200</pubDate>
                <guid isPermaLink="true">https://knieb.es/6a44</guid>
                <description><![CDATA[<p>Ich wollte im Browser eine zeilenweise Ausgabe erzwingen und habe gemogelt, was das Zeug hält nur um es allein in PHP umzusetzen.</p>

<p>Naja, es funktioniert auf jeden Fall.</p>

<pre><code class="language-php">set_time_limit(0);

// Streaming-Setup: gzip/deflate aus, alle Puffer-Ebenen schließen, implicit flush an.
if (function_exists('apache_setenv')) {
    apache_setenv('no-gzip', '1');
}
@ini_set('zlib.output_compression', 'Off');
header('Content-Encoding: none');
while (ob_get_level() &gt; 0) {
    ob_end_flush();
}
ob_implicit_flush(true);

// Mini-HTML-Preamble + Padding, 
// damit Firefox/Safari den Render-Threshold (~1 KB) erreichen.
echo "&lt;!doctype html&gt;&lt;meta charset=utf-8&gt;&lt;title&gt;&lt;/title&gt;\n";
echo str_repeat(' ', 1024) . "\n";
flush();

// Apache mod_proxy_fcgi puffert FastCGI-Pakete ohne flushpackets=on;
// per-line padding drückt jede Zeile über die Puffer-Schwelle und erzwingt Auslieferung.
$line = static function (string $text): void {
    echo $text . str_repeat(' ', 4096) . "\n";
};

// Ausgabe
for ($i = 1; $i &lt;= 10; $i++) {
    $line($i.'&lt;br&gt;');
    sleep(1);
}
</code></pre>
<hr>
<p><a href="mailto:m@kniebes.io?subject=Zeilenweise Text zum Browser streamen. (knieb.es/6a44)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHP]]></category>
                                
            </item>

                            
                
            
            <item>
                
                <title><![CDATA[Suchbegriffe in HTML highlighten]]></title>
                <link>https://kniebes.com/2025/12/14/suchbegriffe-in-html-highlighten.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Sun, 14 Dec 2025 12:40:17 +0100</pubDate>
                <guid isPermaLink="true">https://knieb.es/694d</guid>
                <description><![CDATA[<p>Ich denke, ich habe einen recht brauchbaren RegEx gefunden, um Suchbegriffe in HTML zu highlighten und dabei den Inhalt von Tags zu ignorieren. Befindet sich der Suchbegriff beispielsweise in einem href-Attribut eines a-Tags, sollte der natürlich nicht „gehighlighted“ werden.</p>

<pre><code class="language-php">$html = preg_replace(
    pattern: '/(?![^&lt;&gt;]*&gt;)'.preg_quote($searchTerm, '/').'/ui',
    replacement: '&lt;mark class="tag"&gt;$0&lt;/mark&gt;',
    subject: $html
);
</code></pre>

<p>Naja, wenn es um Tags geht, könnte ich evtl. auf <a href="https://www.php.net/manual/en/function.preg-quote.php"><code>preg_quote()</code></a> verzichten. Aber der Vollständigkeit halber… </p>

<p>So im Nachhinein denke ich mir natürlich: „Hmm… Profan!“ Aber ich bin mir sicher, in einem Jahr müsste ich mir wieder den Kopf zerbrechen. Ich habe das gesucht, um in der HTML-Ansicht meines Zettelkastens die assoziierten Tags im Fließtext hervorzuheben.</p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=Suchbegriffe in HTML highlighten (knieb.es/694d)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHP]]></category>
                
                    <category><![CDATA[Reguläre Ausdrücke]]></category>
                                
            </item>

                            
                
            
            <item>
                
                <title><![CDATA[FTP Deployment]]></title>
                <link>https://kniebes.com/2025/05/01/ftp-deployment.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Thu, 01 May 2025 16:32:48 +0200</pubDate>
                <guid isPermaLink="true">https://knieb.es/5491</guid>
                <description><![CDATA[<p>Wenn man einen Virtual Host ohne SSH &amp; Git benutzt, ist es etwas lästig, Änderungen an einer Seite von Hand mit einem FTP Client hochzuladen. Das Projekt <a href="https://github.com/dg/ftp-deployment">ftp-deplyoment</a> kommt einem da stark entgegen.</p>

<p>Wenn man ein Composer Projekt hat, kann man es mit <code>composer require dg/ftp-deployment</code> in das Projekt einbinden. Dann eine <code>deplyoment.php</code> oder <code>deplyoment.ini</code> erstellen, wie es dort beschrieben ist, und <code>vendor/bin/deployment deployment.php</code> vereinfacht das Leben.</p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=FTP Deployment (knieb.es/5491)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHP]]></category>
                                
            </item>

                            
                
            
            <item>
                
                
                <link>https://kniebes.com/2024/06/23/1268a3266b51.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Sun, 23 Jun 2024 10:28:01 +0200</pubDate>
                <guid isPermaLink="true">https://knieb.es/2fea</guid>
                <description><![CDATA[<p>Bin ich eigentlich der Einzige, der von DDEV manchmal unglaublich genervt ist. Immer wieder stolpere ich über die beiden folgenden Probleme. Vollkommen egal, ob ich Colima oder OrbStack benutze.</p>

<ul>
<li>Irgendwann hört der Mutagen-Spaß auf zu synchronisieren, oder die Synchronisation ist so langsam, dass effektiv keine Arbeit möglich ist. Obwohl in Anbetracht der ignorierten Verzeichnisse in der <code>.ddev/mutagen/mutagen.yml</code> nur eine Hand voll Dateien übrig bleiben, die überhaupt synchronisiert werden müssten.</li>
<li>Xdebug beachtet grundsätzlich nur Breakpoints in der index.php eine Projekts. Alle anderen Breakpoints werden ignoriert.</li>
</ul>

<p>Es ist zwar nervig, den vollständigen Stack in den passenden Versionen lokal zu installieren. Aber arbeiten konnte ich damit immer sehr gut. Ich denke, ich will dahin zurück…</p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=Bin ich eigentlich der Einzige, der von DDEV ... (knieb.es/2fea)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHPStorm]]></category>
                
                    <category><![CDATA[PHP]]></category>
                
                    <category><![CDATA[Xdebug]]></category>
                
                    <category><![CDATA[Job]]></category>
                
                    <category><![CDATA[DDEV]]></category>
                                
            </item>

                            
                
            
            <item>
                
                
                <link>https://kniebes.com/2024/02/23/12688b507144.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Fri, 23 Feb 2024 20:36:52 +0100</pubDate>
                <guid isPermaLink="true">https://knieb.es/28c9</guid>
                <description><![CDATA[<p><q cite="https://www.heise.de/news/PHP-Trend-geht-zu-On-Premises-und-Debian-9636677.html">Die PHP-Nutzer wenden sich ab von den Hyperscalern und setzen vermehrt auf eigene Rechner. Auch Red Hat/Cent OS verlieren gegenüber Debian als Plattformen.</q> &mdash; <a href="https://www.heise.de/news/PHP-Trend-geht-zu-On-Premises-und-Debian-9636677.html">PHP-Trend geht zu On Premises und Debian</a></p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=Die PHP-Nutzer wenden sich ab von den Hyperscalern ... (knieb.es/28c9)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHP]]></category>
                                
            </item>

                            
                
            
            <item>
                
                <title><![CDATA[The Power Of Glob]]></title>
                <link>https://kniebes.com/2022/03/08/the-power-of-glob.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Tue, 08 Mar 2022 07:46:47 +0100</pubDate>
                <guid isPermaLink="true">https://knieb.es/1b16</guid>
                <description><![CDATA[<p>Mir war nicht klar, dass man mit nur einem Aufruf von <a href="https://www.php.net/manual/de/function.glob.php">glob</a> eine Verzeichnis Struktur rekursiv scannen kann, wenn man zuvor die Tiefe kennt.</p>

<pre><code class="language-php">glob("$basedir/{,*/,*/*/,*/*/*/}*.jpg", GLOB_BRACE);
</code></pre>

<p>Das <code>GLOB_BRACE</code>-Flag ist schon ein Knaller.</p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=The Power Of Glob (knieb.es/1b16)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHP]]></category>
                                
            </item>

                            
                
            
            <item>
                
                <title><![CDATA[QCacheGrind]]></title>
                <link>https://kniebes.com/2021/08/19/qcachegrind.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Thu, 19 Aug 2021 22:03:26 +0200</pubDate>
                <guid isPermaLink="true">https://knieb.es/1945</guid>
                <description><![CDATA[<p><a href="https://formulae.brew.sh/formula/qcachegrind">QCacheGrind</a> ist einer meiner neuen engsten Freunde. Immer wenn ich Tools wie dieses entdecke, frage ich mich, wie ich zuvor überhaupt arbeiten konnte.</p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=QCacheGrind (knieb.es/1945)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHP]]></category>
                
                    <category><![CDATA[Xdebug]]></category>
                                
            </item>

                            
                
            
            <item>
                
                <title><![CDATA[XML-Line-Parser]]></title>
                <link>https://kniebes.com/2004/06/01/xml-line-parser.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Tue, 01 Jun 2004 10:50:00 +0200</pubDate>
                <guid isPermaLink="true">https://knieb.es/cb0</guid>
                <description><![CDATA[<p><a href="http://www.media-palette.de/tools/xml-line/">XML-Line-Parser</a>: <q>Eine PHP-Klasse für die Abfrage und Änderung von XML-Dokumenten.</q></p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=XML-Line-Parser (knieb.es/cb0)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHP]]></category>
                
                    <category><![CDATA[XML]]></category>
                                
            </item>

                            
                
            
            <item>
                
                <title><![CDATA[Portable Document Markup Language]]></title>
                <link>https://kniebes.com/2004/05/12/portable-document-markup-language.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Wed, 12 May 2004 21:29:00 +0200</pubDate>
                <guid isPermaLink="true">https://knieb.es/d07</guid>
                <description><![CDATA[<p><a href="http://pdml.sourceforge.net/index.php">Portable Document Markup Language</a>:</p>
<blockquote>
<p><span class="caps">PDML</span> is an informal markup language written in 100% <span class="caps">PHP</span>, allowing to create complex <span class="caps">PDF</span> documents very easily for people already familiar with <span class="caps">HTML</span>. People familiar with <span class="caps">PHP</span> can also use it as a way to define templates for dynamic <span class="caps">PDF</span> documents.</p>
</blockquote><hr>
<p><a href="mailto:m@kniebes.io?subject=Portable Document Markup Language (knieb.es/d07)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[PHP]]></category>
                                
            </item>

                            
        
    </channel>
</rss>
