Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:118875 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 64627 invoked from network); 24 Oct 2022 08:25:09 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 24 Oct 2022 08:25:09 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id A5F0B1804C4 for ; Mon, 24 Oct 2022 01:25:07 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,NICE_REPLY_A, SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.2 X-Spam-ASN: AS197422 91.224.148.0/23 X-Spam-Virus: No X-Envelope-From: Received: from pouzenc.fr (mail.pouzenc.fr [91.224.149.159]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Mon, 24 Oct 2022 01:25:06 -0700 (PDT) Received: from [2a01:e0a:a7b:91e0:229:63dc:3097:79c0] by pouzenc.fr with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1omslb-0001Bd-41; Mon, 24 Oct 2022 08:25:04 +0000 Message-ID: <623919d8-4618-b976-1282-bbb6c080588a@pouzenc.fr> Date: Mon, 24 Oct 2022 10:25:02 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.3.0 To: Larry Garfield , php internals References: <50321070-3682-c238-d8b4-3d0f6832c4bc@pouzenc.fr> Content-Language: fr In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [PHP-DEV] Newcomer, PHP pre-processing, Magic Constants __FILE__ and __LINE__ override with #line like in C From: ludovic@pouzenc.fr (Ludovic Pouzenc) Le 23/10/2022 à 18:02, Larry Garfield a écrit : > On Sun, Oct 23, 2022, at 8:43 AM, Ludovic Pouzenc wrote: >> Hi, >> >> I'm a newcomer here. I came from https://wiki.php.net/rfc/howto. >> >> *TL;DR:* I want to know if a proposal of a #line parsing to alter >> __FILE__ and __LINE__ in PHP like it exists in C could be a good idea. >> >> I've searched about __LINE__ and __FILE__ in mailing archives and wiki, >> I don't really find things matching. I hope it's not because "__" are >> stripped before search. "Magic constants" didn't help neither. Let me >> know if I am rethinking and old thing already imagined here in the past. >> >> *Background / use case:* I think at first about webservices, maybe the >> useful also with browser/human-facing use cases. >> >> With PHP, it's hard to get high responsiveness under load if user code >> start by loading a composer's autoload.php, then (lazy) loads a whole >> framework with 10+ dependencies, then execute 1 SQL request, 1 >> json_encode() then output and exit. Even with "Slim" framework that >> should be minimal, using only the route feature, I see "strace" counting >> 200+ file-related syscalls per request with recent >> linux/debian/apache/php-fpm. >> >> It's not so hard to get it better with other langages : when they are >> compiled, or when framework loading happens at server start and to at >> each request. >> >> Web projects have more and more a "compilation" phase for minimising JS, >> for proprocessing scss to css, it is possible to hook it some PHP >> processing too. >> >> In my university, I started using a purpose-written PHP Preprocessor to >> minimize runtime dependency loading. It only understands #include like >> in C. From a src/mywebservice/v1/some-endpoint.php it will generate and >> build/mywebservice/v1/some-endpoint.php with all #include >> "some/path/somedep.php" replaced by the file's contents. >> >> So the generated some-endpoint.php have no run-time dependency at all: >> no autoload, no include(), no require(). I think it evens maximize the >> gains with APC caching. >> >> The preprocessor also generate things like #line 2 >> "some/path/somedep.php" where an #include was encountered, then a thing >> like #line 47 "src/mywebservice/v1/some-endpoint.php" right after the >> end of the inclusion. In C, a great concrete example of #line importance >> is working with a flex/bison parser generator. >> >> If PHP parser interpret #line as in C, __FILE__ and __LINE__ Magic >> Constants will be changed to source file and line, instead of generated >> file and line. It could greatly improve development write-then-rerun >> cycle. (missing ";" at line NN , other PHP Errors, Exception details/traces) >> >> I hope it could unlock many use cases where "big" PHP frameworks get >> really hard time to try to compete with other languages equivalents. >> >> Do you think it's an idea that is suitable to discuss, improve and >> submit as an RFC ? >> >> Regards, > It sounds like there are numerous existing approaches to address the situation you describe that are already in use and far more effective than making constants stealthily dynamic. > > 1. Opcache preloading, introduced in PHP 7.4. > 2. Disable the stat calls on opcache, so it doesn't even check the disk at all once something is in cache. > 3. Use a persistent-process tool like React PHP, AmPHP, Revolt, and the like, so it functions more like Node.js instead of using PHP-FPM. > > I think you're also greatly over-estimating how large the startup cost is in practice. It's real, certainly, but unless you have several nested microservices a well-made framework should have a fairly small overhead. > > --Larry Garfield > Thanks for replies, I will test tools and features mentionned above. -- Ludovic Pouzenc www.pouzenc.fr