1
+ <?php
2
+
3
+ /**
4
+ * Clase para manejar tareas asíncronas
5
+ */
6
+ class TareaAsincrona {
7
+ private $ nombre ;
8
+ private $ segundos ;
9
+ private $ pid ;
10
+
11
+ /**
12
+ * Constructor de la clase
13
+ * @param string $nombre Nombre de la tarea
14
+ * @param int $segundos Duración de la tarea en segundos
15
+ */
16
+ public function __construct ($ nombre , $ segundos ) {
17
+ $ this ->nombre = $ nombre ;
18
+ $ this ->segundos = $ segundos ;
19
+ }
20
+
21
+ /**
22
+ * Ejecuta la tarea de forma asíncrona
23
+ * @return bool True si la tarea se inició correctamente
24
+ */
25
+ public function ejecutar () {
26
+ // Crear un proceso hijo
27
+ $ pid = pcntl_fork ();
28
+
29
+ if ($ pid == -1 ) {
30
+ die ("No se pudo crear el proceso hijo \n" );
31
+ } else if ($ pid ) {
32
+ // Proceso padre
33
+ $ this ->pid = $ pid ;
34
+ return true ;
35
+ } else {
36
+ // Proceso hijo
37
+ echo "{$ this ->nombre } - Iniciando... \n" ;
38
+ echo "{$ this ->nombre } - Durará {$ this ->segundos } segundos \n" ;
39
+ sleep ($ this ->segundos );
40
+ echo "{$ this ->nombre } - Finalizada \n" ;
41
+ exit (0 );
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Espera a que la tarea termine
47
+ */
48
+ public function esperar () {
49
+ if ($ this ->pid ) {
50
+ pcntl_waitpid ($ this ->pid , $ status );
51
+ }
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Demostración básica de una tarea asíncrona
57
+ */
58
+ function demostracionBasica () {
59
+ echo "=== Demostración Básica === \n" ;
60
+ $ tarea = new TareaAsincrona ("TareaEjemplo " , 2 );
61
+ $ tarea ->ejecutar ();
62
+ $ tarea ->esperar ();
63
+ }
64
+
65
+ /**
66
+ * Implementación de la dificultad extra
67
+ */
68
+ function dificultadExtra () {
69
+ echo "\n=== Dificultad Extra === \n" ;
70
+
71
+ // Crear las tareas
72
+ $ tareaC = new TareaAsincrona ("Tarea C " , 3 );
73
+ $ tareaB = new TareaAsincrona ("Tarea B " , 2 );
74
+ $ tareaA = new TareaAsincrona ("Tarea A " , 1 );
75
+ $ tareaD = new TareaAsincrona ("Tarea D " , 1 );
76
+
77
+ // Ejecutar C, B y A en paralelo
78
+ $ tareaC ->ejecutar ();
79
+ $ tareaB ->ejecutar ();
80
+ $ tareaA ->ejecutar ();
81
+
82
+ // Esperar a que terminen C, B y A
83
+ $ tareaC ->esperar ();
84
+ $ tareaB ->esperar ();
85
+ $ tareaA ->esperar ();
86
+
87
+ // Ejecutar D después de que las otras hayan terminado
88
+ $ tareaD ->ejecutar ();
89
+ $ tareaD ->esperar ();
90
+ }
91
+
92
+ // Función principal
93
+ function main () {
94
+ demostracionBasica ();
95
+ dificultadExtra ();
96
+ }
97
+
98
+ // Ejecutar el programa
99
+ main ();
100
+
101
+ ?>
0 commit comments