Newsgroups: php.internals
Path: news.php.net
Xref: news.php.net php.internals:126824
X-Original-To: internals@lists.php.net
Delivered-To: internals@lists.php.net
Received: from php-smtp4.php.net (php-smtp4.php.net [45.112.84.5])
	by qa.php.net (Postfix) with ESMTPS id AF4621A00BC
	for <internals@lists.php.net>; Tue, 18 Mar 2025 13:53:10 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail;
	t=1742305838; bh=CEPiKJJOtVN0Jar28VATBAmqjxh6bxj7OdHLsa+Zalc=;
	h=References:In-Reply-To:From:Date:Subject:To:Cc:From;
	b=fSiEO2hDjU9Fnk2EMFo2qF/uCLqy/3/I/gALEUozKmR2K/sAiRumsylVGYB+UZSjd
	 ImdYFQLLURwTFpPyVG6sCuDwCx8/cXJ1K/K3xsvfyvXP2puOXwWPvF5iDpWVEFxiAh
	 7mXQQOwHUhYC4d5sn9RbhNmFYBm4JBd5JkTdeW6xqOBEaD5Q9mCb+WwS0ebnzleJKb
	 VHDgM0zR157HahSVmyPx0Xe6NVR+ws8bPuFXgU6W4DGrgmYm18L+ApGpp2C6Bc4qtT
	 HAEQbC+RLxR5Z9tQMfYn2nswQXWjF4sBetVIwg45OgSyxjMYaTDlhq6bW57YrInukX
	 OSMc3JKWfWJeA==
Received: from php-smtp4.php.net (localhost [127.0.0.1])
	by php-smtp4.php.net (Postfix) with ESMTP id 82D351801E7
	for <internals@lists.php.net>; Tue, 18 Mar 2025 13:50:36 +0000 (UTC)
X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on php-smtp4.php.net
X-Spam-Level: 
X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_50,DKIM_SIGNED,
	DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,DMARC_PASS,FREEMAIL_FROM,
	HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,
	SPF_PASS autolearn=no autolearn_force=no version=4.0.0
X-Spam-Virus: No
X-Envelope-From: <edmond.ht@gmail.com>
Received: from mail-yb1-f180.google.com (mail-yb1-f180.google.com [209.85.219.180])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256)
	(No client certificate requested)
	by php-smtp4.php.net (Postfix) with ESMTPS
	for <internals@lists.php.net>; Tue, 18 Mar 2025 13:50:29 +0000 (UTC)
Received: by mail-yb1-f180.google.com with SMTP id 3f1490d57ef6-e63c966fe37so3905015276.0
        for <internals@lists.php.net>; Tue, 18 Mar 2025 06:53:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20230601; t=1742305980; x=1742910780; darn=lists.php.net;
        h=cc:to:subject:message-id:date:from:in-reply-to:references
         :mime-version:from:to:cc:subject:date:message-id:reply-to;
        bh=2gXYv3A/yoMm/aP68OaaNF19cE+DXMxZCpTprl0wsdk=;
        b=a1ltM7Rsu9VcJCiVrIsLQJYwAvA89IBzfXk3fz+k21YA16zt5DtdY89oDxdeZTZDaz
         rKPybCRx+tZYIyHraZvXmLtJsK/0dCjqLdeHh0FSgUsgl9AE0KlxFa5BGG4MnsB3WlLp
         cF7jELo0uqXkWcWlg5k+2CfvwMfxxHd9qZ/Syf0IIDbbD5X8AkTLuAidxRD/jmOFjE9c
         CmiMJvX6BG4CZZ0rkknBih+XizTri6x9xgxkDRQiOHiw9IHpuC/5gx9YkfzGkl0F79Iq
         xz12Vk71/EDFkC+pVLS1t2ED9K6uAlbjUBlHujNLkkbyp1rXBGb3ZWGx0FF+1FOcq22s
         uptg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20230601; t=1742305980; x=1742910780;
        h=cc:to:subject:message-id:date:from:in-reply-to:references
         :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id
         :reply-to;
        bh=2gXYv3A/yoMm/aP68OaaNF19cE+DXMxZCpTprl0wsdk=;
        b=uDeOzDhm6Ed5Jk1XOus1RlfsrdoTPkfPaEf5dtDt6c1PGGIMBSKAofSeFIji0ZdV/m
         P/7EbfDa2tr7lGQfSM1qfFdMJpXnVMYLrb7XnRoamuLKzk/XBDUQv2qy+xdOuRYr9Oy4
         UGjvBizEQdpKvdibJQkvq+r/tOI75JItCOZuS3VyyXJf49TI3+R0rVdF3uYM+g58Ep3C
         hwH9TI0llvdUQG9EUw3er7CQYnqMJszZFgxRy12GTHv89j7kjPsmcUpMaFwxqM/j5Jvm
         2N/8VBTXv/CrUF9rSYlhI/YB8V4uP+Pxt5HoKTnF7qGgFRCzJv1/LEwnV5DqaTafCLum
         ntXQ==
X-Gm-Message-State: AOJu0YwOwrscGlVFC+HI7hgN1wpgK4oiJNIOxiAaSzbpvCeEkgT/iW7S
	tXqr41EhV1VsTebqwRxRzhVYtwXJ/HE71p/gdTyypZiAx7F0MNTIF45ydAQNyWaI0XcGuZj4PN6
	YlQSBirp6Xs97rnEllx+DbCkc2nLmK3HWh/M=
X-Gm-Gg: ASbGncub+KJCiGRUZQY6RKkK2wQdO5FZMJeFaOSIicz/oc8SkEvoFsFY/tmXOyMaVHj
	FAPIqYlutEAnlfbp1ZnhJeLHG7nb8UErnfofzV5IJKrPSTcxGGdkO5F+HtJZgZXcKCoxmUepNYR
	TIvAdeV9WVNDi75eqaLEqxJZ8Qug==
X-Google-Smtp-Source: AGHT+IEjXNwpSVYj8Yg0gnDW253R2G9BG9A1QWS30w8DMJmAoa8Iga3mIp57nSLXwOlOds5ZE7Q41iPp91HIJ5vdDwY=
X-Received: by 2002:a05:6902:2581:b0:e60:8734:64df with SMTP id
 3f1490d57ef6-e64c0e1e1c6mr4761717276.36.1742305980402; Tue, 18 Mar 2025
 06:53:00 -0700 (PDT)
Precedence: bulk
list-help: <mailto:internals+help@lists.php.net
list-unsubscribe: <mailto:internals+unsubscribe@lists.php.net>
list-post: <mailto:internals@lists.php.net>
List-Id: internals.lists.php.net
x-ms-reactions: disallow
MIME-Version: 1.0
References: <CAMW7n8DQqUhnb+U+WcA7bJ-APRDTtzuJC4m8s-q_2LH7bEuH+A@mail.gmail.com>
 <72bd5401-53a9-409f-ad45-687333401961@rwec.co.uk> <CAMW7n8De15X4xDNOBULKeKkpeCeNo-tDWVWZ+Zer8vMa3U-vQg@mail.gmail.com>
 <d50b892b-9372-45c0-81ad-1ce818385b75@rwec.co.uk> <CAMW7n8C16d14earerxvCPe_kyym09GOa8mh4qwPz8AKVKQjHsw@mail.gmail.com>
In-Reply-To: <CAMW7n8C16d14earerxvCPe_kyym09GOa8mh4qwPz8AKVKQjHsw@mail.gmail.com>
Date: Tue, 18 Mar 2025 15:52:48 +0200
X-Gm-Features: AQ5f1JqmYHWKWOmflJNr84d71b_7ZQ7P9hGlW7-ocaCtBFxPb_hUsryoEE4UmkI
Message-ID: <CAMW7n8C56acarsXA2_vGnO0K5+h_rhwYLJJDJPho5TjisWQG-A@mail.gmail.com>
Subject: Re: [PHP-DEV] PHP True Async RFC - Stage 2
To: "Rowan Tommins [IMSoP]" <imsop.php@rwec.co.uk>
Cc: internals@lists.php.net
Content-Type: multipart/alternative; boundary="0000000000000d533806309e39d3"
From: edmond.ht@gmail.com (Edmond Dantes)

--0000000000000d533806309e39d3
Content-Type: text/plain; charset="UTF-8"

Oops, I made a mistake in the logic of `Scope` and coroutines.

According to the RFC, the following code behaves differently:

```php
currentScope()->spawn ... // This coroutine belongs to the Scope
spawn ... // This one is a child coroutine
```

I was sure that I had checked all the major edge cases. Sorry.
This will be fixed soon.

P.S. + 1 example:

<?php


declare(strict_types=1);

use Async\Scope;
use function Async\currentScope;

function fetchUrl(string $url): string {
    $ctx = stream_context_create(['http' => ['timeout' => 5]]);
    return file_get_contents($url, false, $ctx);
}

function fetchAllUrls(array $urls): array
{
    $futures = [];

    foreach ($urls as $url) {
        $futures[$url] = (spawn fetchUrl($url))->getFuture();
    }

    await currentScope();

    $results = [];

    foreach ($futures as $url => $future) {
        $results[$url] = $future->getResult();
    }

    return $results;
}

$urls = [
    'https://example.com',
    'https://php.net',
    'https://openai.com'
];

$results = await spawn fetchAllUrls($urls);
print_r($results);


---
Ed.

>

--0000000000000d533806309e39d3
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>Oops, I made a mistake in the logic of `Scope` and co=
routines. =C2=A0<br><br>According to the RFC, the following code behaves di=
fferently: =C2=A0<br><br>```php<br>currentScope()-&gt;spawn ... // This cor=
outine belongs to the Scope<br>spawn ... // This one is a child coroutine<b=
r></div><div>```</div><div><br></div><div>I was sure that I had checked all=
 the major edge cases. Sorry.</div><div>This will be fixed soon.=C2=A0=C2=
=A0<br></div><div><br></div><div>P.S. + 1 example:</div><div><br></div><div=
><span style=3D"color:rgb(0,51,179);font-family:&quot;JetBrains Mono&quot;,=
monospace">&lt;?php</span></div><div><div style=3D"color:rgb(8,8,8)"><pre s=
tyle=3D"font-family:&quot;JetBrains Mono&quot;,monospace"><span style=3D"co=
lor:rgb(0,51,179)"><br></span><span style=3D"color:rgb(0,51,179)">declare</=
span>(<span style=3D"color:rgb(0,0,0)">strict_types</span>=3D<span style=3D=
"color:rgb(23,80,235)">1</span>);<br><br><span style=3D"color:rgb(0,51,179)=
">use </span><span style=3D"color:rgb(128,128,128)">Async\Scope</span>;<br>=
<span style=3D"color:rgb(0,51,179)">use function </span><span style=3D"colo=
r:rgb(0,0,0)">Async</span>\<span style=3D"color:rgb(0,98,122)">currentScope=
</span>;<br><br><span style=3D"color:rgb(0,51,179)">function </span><span s=
tyle=3D"color:rgb(0,98,122)">fetchUrl</span>(<span style=3D"color:rgb(0,51,=
179)">string </span><span style=3D"color:rgb(102,0,0)">$url</span>): <span =
style=3D"color:rgb(0,51,179)">string </span>{<br>    <span style=3D"color:r=
gb(102,0,0)">$ctx </span>=3D <span style=3D"color:rgb(0,98,122)">stream_con=
text_create</span>([<span style=3D"color:rgb(6,125,23)">&#39;http&#39; </sp=
an>=3D&gt; [<span style=3D"color:rgb(6,125,23)">&#39;timeout&#39; </span>=
=3D&gt; <span style=3D"color:rgb(23,80,235)">5</span>]]);<br>    <span styl=
e=3D"color:rgb(0,51,179)">return </span><span style=3D"color:rgb(0,98,122)"=
>file_get_contents</span>(<span style=3D"color:rgb(102,0,0)">$url</span>, <=
span style=3D"color:rgb(0,51,179)">false</span>, <span style=3D"color:rgb(1=
02,0,0)">$ctx</span>);<br>}<br><br><span style=3D"color:rgb(0,51,179)">func=
tion </span><span style=3D"color:rgb(0,98,122)">fetchAllUrls</span>(<span s=
tyle=3D"color:rgb(0,51,179)">array </span><span style=3D"color:rgb(102,0,0)=
">$urls</span>): <span style=3D"color:rgb(0,51,179)">array<br></span>{<br> =
   <span style=3D"color:rgb(102,0,0)">$futures </span>=3D [];<br>    <br>  =
  <span style=3D"color:rgb(0,51,179)">foreach </span>(<span style=3D"color:=
rgb(102,0,0)">$urls </span><span style=3D"color:rgb(0,51,179)">as </span><s=
pan style=3D"color:rgb(102,0,0)">$url</span>) {<br>        <span style=3D"c=
olor:rgb(102,0,0)">$futures</span>[<span style=3D"color:rgb(102,0,0)">$url<=
/span>] =3D (<span style=3D"color:rgb(135,16,148);font-style:italic">spawn =
</span><span style=3D"color:rgb(0,98,122)">fetchUrl</span>(<span style=3D"c=
olor:rgb(102,0,0)">$url</span>))-&gt;getFuture();<br>    }<br>    <br>    <=
span style=3D"color:rgb(135,16,148);font-style:italic">await </span><span s=
tyle=3D"color:rgb(0,98,122)">currentScope</span>();<br>    <br>    <span st=
yle=3D"color:rgb(102,0,0)">$results </span>=3D [];<br>    <br>    <span sty=
le=3D"color:rgb(0,51,179)">foreach </span>(<span style=3D"color:rgb(102,0,0=
)">$futures </span><span style=3D"color:rgb(0,51,179)">as </span><span styl=
e=3D"color:rgb(102,0,0)">$url </span>=3D&gt; <span style=3D"color:rgb(102,0=
,0)">$future</span>) {<br>        <span style=3D"color:rgb(102,0,0)">$resul=
ts</span>[<span style=3D"color:rgb(102,0,0)">$url</span>] =3D <span style=
=3D"color:rgb(102,0,0)">$future</span>-&gt;<span style=3D"color:rgb(0,98,12=
2)">getResult</span>();<br>    }<br>    <br>    <span style=3D"color:rgb(0,=
51,179)">return </span><span style=3D"color:rgb(102,0,0)">$results</span>;<=
br>}<br><br><span style=3D"color:rgb(102,0,0)">$urls </span>=3D [<br>    <s=
pan style=3D"color:rgb(6,125,23)">&#39;<a href=3D"https://example.com">http=
s://example.com</a>&#39;</span>,<br>    <span style=3D"color:rgb(6,125,23)"=
>&#39;<a href=3D"https://php.net">https://php.net</a>&#39;</span>,<br>    <=
span style=3D"color:rgb(6,125,23)">&#39;<a href=3D"https://openai.com">http=
s://openai.com</a>&#39;<br></span>];<br><br><span style=3D"color:rgb(102,0,=
0)">$results </span>=3D <span style=3D"color:rgb(135,16,148);font-style:ita=
lic">await spawn </span><span style=3D"color:rgb(0,98,122)">fetchAllUrls</s=
pan>(<span style=3D"color:rgb(102,0,0)">$urls</span>);<br><span style=3D"co=
lor:rgb(0,98,122)">print_r</span>(<span style=3D"color:rgb(102,0,0)">$resul=
ts</span>);</pre></div></div><div><br></div><div>---</div><div>Ed.</div><di=
v class=3D"gmail_quote gmail_quote_container"><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,20=
4);padding-left:1ex">
</blockquote></div></div>

--0000000000000d533806309e39d3--