1
+ <?php
2
+
3
+ require 'vendor/autoload.php ' ;
4
+
5
+ use Amp \Loop ;
6
+ use Amp \Promise ;
7
+
8
+ /*
9
+ * De forma nativa, php no tiene soporte para funciones asíncronas.
10
+ * Sin embargo, podemos simularlo con la función sleep.
11
+ */
12
+ function asyncTask ($ name , $ seconds ){
13
+ echo "Función asíncrona con nombre $ name iniciada en el instante " . date ('H:i:s ' ) . "\n" ;
14
+ sleep ($ seconds );
15
+ echo "Función asíncrona con nombre $ name finalizada en el instante " . date ('H:i:s ' ) . "\n" ;
16
+ }
17
+
18
+ echo "Simulacion con sleep (No realmente asincrono) \n" ;
19
+ asyncTask ('MiFuncion ' , 5 );
20
+
21
+ /*
22
+ * Para realizar tareas asíncronas de forma real, podemos utilizar librerías externas como Amp.
23
+ * Amp es una librería que nos permite realizar tareas asíncronas de forma sencilla.
24
+ */
25
+
26
+ function asyncTaskAmp ($ name , $ seconds ){
27
+ return Amp \call (function () use ($ name , $ seconds ) {
28
+ echo "Función asíncrona con nombre $ name iniciada en el instante " . date ('H:i:s ' ) . "\n" ;
29
+ yield Amp \delay ($ seconds * 1000 ); // Amp\delay espera un tiempo en milisegundos
30
+ echo "Función asíncrona con nombre $ name finalizada en el instante " . date ('H:i:s ' ) . "\n" ;
31
+ });
32
+ }
33
+
34
+ echo "\n\nAsincronía real mediante uso de libreria externa \n" ;
35
+ Loop::run (function () {
36
+ asyncTaskAmp ('MiFuncion ' , 5 );
37
+ });
38
+
39
+ echo "\n\nEjercicio Extra (solo con Amp, con sleep no se podria hacer) \n" ;
40
+ Loop::run (function () {
41
+ // Iniciar las funciones C, B y A en paralelo
42
+ $ promises = [
43
+ asyncTaskAmp ('C ' , 3 ),
44
+ asyncTaskAmp ('B ' , 2 ),
45
+ asyncTaskAmp ('A ' , 1 ),
46
+ ];
47
+
48
+ // Esperar a que las funciones C, B y A finalicen
49
+ Promise \wait (Promise \all ($ promises ));
50
+
51
+ // Iniciar la función D
52
+ Loop::run (function () {
53
+ asyncTaskAmp ('D ' , 1 );
54
+ });
55
+ });
0 commit comments