funktionieren alle 3 wie erwartet.
Aus einem Browser aufgerufen, funktioneren nur info.php und errno.php wie erwartet.
Bei printf.php seh' ich im Browser nix. Also nur eine weisse Seite.
In den logs seh' ich kein Genoergele.
Aber: Wenn ich errno.php nach printf.php aufrufe, ist errno 2.
Was laut /usr/include/asm-generic/errno-base.h das bedeutet:
Ich hab' jetzt mal im printf.php die Zeile mit printf dahingehend abgeaendert:
1
var_dump($ffi->printf("Hello %s!\n", "world"));
Und kriege int(13) im Browser angezeigt.
Was ja der Rueckgabewert von printf sein wird. Also geht anscheinend der stdout der libc irgendwie nicht an php-fpm, so wie's aussieht? Aber warum, und wohin geht der?
Kann/muss man da
evtl. noch "ein Kabel fuer stdout ziehen"?
Tut mir leid, das kann ich mangels Wissen & Erfahrung wirklich nicht beantworten - nginx hab' ich noch nie verwendet, und mein Wissen über php/apache ist auch eher an meinen Bedarf angepasst.
/Brauchst/ Du denn printf, oder könntest Du das, was Du ausgeben willst, nicht auch anders transportieren?
sprintf beispielsweise kann in ein char-Array ausgeben, und das wiederum sollte man mit var_dump sehen können.
Nee, nicht wirklich.
Ist nur irgendwie kein schoenes Gefuehl, wenn man schon bei den simplen copy+paste Beispielen aus der doku solche eigenartigen Effekte hat...
Nun, das Beispiel funktioiert ja. Mit php.
Nur nicht mit dem in Deinen Webserver integrierten php.
Ja, das ist nicht hilfreich, aber es ist zu befürchten, daß das irgendjemand so begründen wird.
Aber das ist halt auch ein Grenzfall, nämlich die Nutzung der Betriebssystemschnittstelle des C-Runtime-Systems, und nicht die Nutzung von C an sich. Wenn Du also vermeidest, Funktionen zu verwenden, die stdin/stdout/stderr verwenden, müsstest Du zurechtkommen können.
Nun, das Beispiel funktioiert ja. Mit php.
Nur nicht mit dem in Deinen Webserver integrierten php.
Ja, das ist nicht hilfreich, aber es ist zu befürchten, daß das
irgendjemand so begründen wird.
Wenns das tatsaechlich ist, dann isses voellig OK. Waere evtl. ein kleiner Hinweis bei dem offiziellen Beispiel nicht schlecht. Wenns aber prinzipiell funktioniert, nur bei mir - aus Gruenden - halt nicht, dann isses doof.
Aber das ist halt auch ein Grenzfall, nämlich die Nutzung der
Betriebssystemschnittstelle des C-Runtime-Systems, und nicht die Nutzung
von C an sich.
Wie ich das das erste Mal mitgekriegt hab, dass es ueberhaupt sowas gibt, habbich auch erstmal 3..4 Baukloetze gestaunt.
Damit ich's mal wieder find', wenn ich's brauch, und damit andere sich ordentlich amuesieren koennen, hier mal ein Beispiel, was ohne stdout auskommt und bei mir so tut, wie ich es erwartet habe:
bla.c:
Ob man ffi::cdef auch eine *.h-Datei unterjubeln kann? Dann könnte struct sbla und die Prototypen dort untergebracht und sowohl vom C-Compiler als auch ffi verwendet werden, was die Fehlerquote bei Änderungen reduzieren würde (keine mehreren, aktuell zu haltenden identischen Deklarationen an unterschiedlichen Stellen)
Generell: Du schreibst mittels C-printf direkt auf STDOUT in deinem PHP-Script.
Früher™, wenn PHP als CGI eingebunden war, ging das mit in die Antwort des Webservers ein.
War aber eher so eine Art dreckiger Nebeneffekt, dass das ging. Und hat auch nicht gut mit "output_buffering", "output_handler", "ob_start()&co" zusammengespielt.
mit FPM geht das garnicht mehr.
Die Default-Config von FPM hat catch_workers_output=no
Bedeutet: Alle deine STDOUT-Writes landen in /dev/null.
Wenn du das auf "yes" stellst, landen deine C-printfs im Logfile.
In der Webserver-Antwort landen sie nie.
Tja, so ist das halt. Wenn ich 12V für eine Fritzbox möchte und nur 400V/125A habe, funktioniert ein Zwischenstecker mit einem einfachen Stück Kabel dran, auch eher suboptimal.
Die Default-Config von FPM hat catch_workers_output=no
Bedeutet: Alle deine STDOUT-Writes landen in /dev/null.
Wenn du das auf "yes" stellst, landen deine C-printfs im Logfile.
Wollt' ich spasshalber mal probieren, scheitert aber auch klaeglich. Mein php (8.2.9) erkennt diese Option weder in php.ini noch php-fpm.conf
Naja, eh' wurscht. Was ich ans laufen bringen wollte, laeuft soweit.