[Pregunta]: Pregunta rápida y sencilla sobre el siguiente código.

Iniciado por Leguim, 14 Octubre 2020, 08:00 AM

0 Miembros y 2 Visitantes están viendo este tema.

Leguim

Bueno, puede parecer una pregunta media estúpida pero igual me parece interesante preguntarlo.



Básicamente tengo una variable ($number) que estará inicializada con el valor 1, entonces tengo un ciclo do while donde la primera iteración va a incrementar dicha variable a +1 entonces para las siguientes iteraciones se va a preguntar si el numero es diferente de 8, si ese es el caso entonces va a ir incrementando hasta llegar a dicho valor.

Ahora mi pregunta es, ese ciclo que se va repitiendo (en este caso unas 7 veces) recién cuando finalice va a ejecutar la siguiente instrucción de enviar un mensaje por pantalla?

Es decir a mi me parece que esto es síncrono y se va a mostrar el mensaje cuando terminen todas las iteraciones pero me parecía que era bueno preguntarlo.

Gracias.

WHK

Hola, claro, en php no existe nada asyncrónico, de hecho hoy en día ya casi no vale la pena aprender php.

Algunas diferencias claves entre php y otros lenguajes son las siguientes:

Funciones asyncrónicas por defecto: En PHP todo es síncrono o sea, todo se ejecuta bajo el mismo thread, por este motivo no existen los eventos asincrónicos porque nativamente php no los soporta. Hay módulos para ejecutar tareas asincrónicas pero son módulos instalables no nativos. Generalmente cuando trabajas mucho tiempo con NodeJS uno se acostumbra que casi todo es asincrónico, de hecho si haces un .each() a una pila de datos verás que el loop se ejecuta de manera asyncrona por defecto, por eso debes pasarle una función como argumento porque es el callback de cada llamado, a menos que uses for(), pero en php esto no es así.

Ejecución persistente: Cuando escribes un código WEB en php debes tener en cuenta que todo el framework o todo el archivo se cargará cada ves que un usuario entre al sitio web, el apache levantará un thread y este invocará al script de php, esto quiere decir que debe inicializar todas las clases y funciones y parsear el código cada ves que alguien entra, esto provoca una carga exagerada al servidor en temas de procesamiento y uso de memoria, a demás, no puedes almacenar información persistente en alguna clase como variable porque todos los datos se destruyen al momento de finalizar la petición WEB del usuario, por eso se necesita tanto el uso de sesiones, en cambio en lenguajes de ejecución persistente como Java, Python, Node, Ruby, etc, se ejecutan una única ves, todo se inicializa, clases, funciones, variables, etc y por cada petición se llama a una función encargada de procesar los datos, pero no tiene que cargar a memoria toda la aplicación por cada petición, por esto el performance y la velocidad de respuesta es mucho mayor que php, se necesita un uso de memoria constante para mantener la aplicación corriendo en todo momento pero reduce el costo de carga por cada petición, por eso casi no existen sistemas transaccionales de alta demanda en php, por eso facebook tuvo que precompilar el código y llevarlo directo a la memoria sobre una máquina virtual como lo hace java. En una aplicación persistente no puedes guardar datos temporales en variables privadas de una clase persistente, en php da igual, por eso hay tantos errores de programación cuando te pasas de java a php o de php a java porque la manera de pensar la ejecución de las aplicaciones son totalmente distintas.

El uso de componentes externos: En PHP si quieres hacer uso de un componente debes instalarlo como librería compilada para la versión y arquitectura de tu sistema, generalmente es un .dll o un .so y las instalaciones no son nada faciles y pecl no tiene muchos adeptos. A comparación de otros lenguajes donde cada uno tiene su propio sistema de gestión de repositorios altamente robustos, en NodeJS usamos npm para instalar los módulos y estos a su ves pueden quedar almacenados en el mismo directorio de la aplicación o globalizarlos y puedes omitirlos cuando trabajas en equipo con otras personas usando repositorios porque luego los instalas desde el archivo del listado de dependencias (package.json), en python es la misma historia, tienes pip y la lista de paquetes vía requirements.txt, lo mismo con ruby y sus gemas, etc, pero en php el uso de repositorios es un desastre y generalmente debes depender demasiado del pool de funciones nativas, por eso es que php tiene funciones nativas para casi todo, porque instalar componentes adicionales es todo un lí, en cambio las personas que usan lenguajes modernos están acostumbrados a que el lenguaje que usan tiene solo lo justo y necesario y todo lo demás se instala como módulo y listo.

Mira, tu código lo puedes resumir de esta manera:

Código (php) [Seleccionar]
<?php
$n
=1;

while(
$n 8){
    
$n++;
}

echo 
'foo';


Pero también así:

Código (php) [Seleccionar]
<?php

for($n 0$n 8$n++){
}

echo 
'foo';


whk@machine:~/Descargas$ php -r 'for($n=0;$n<8;$n++){ echo "${n}\n"; } echo "fin\n";'
0
1
2
3
4
5
6
7
fin


Recuerda que php no necesita cierre de tag si no vas a arrojar contenido plano después de tu código, de hecho se recomienda dentro de lo posible nunca cerrar el tag porque cuando lo cierras hay muchos editores que le agregan un salto de línea adicional y esto provoca que php expulse (como si fuera un echo) ese salto de línea y esto puede ser fatal en un sistema WEB ya que cuando quieras ejecutar la función header() para enviar una cabecera te arrojará un warning porque no puedes enviar una cabecera después de enviar el body de la respuesta http debido a ese salto de línea que se escapa, por eso siempre es mejor no cerrar los scripts.

Saludos.

Danielㅤ

Hola, a tu código le falta el incremento, tiene el while y la condición, pero no tiene el incremento de valor en la variable $number solo tiene en el "do" pero eso se ejecuta una sola vez, la variable $number no tiene el incremento ni al lado del while ni dentro del bucle.

Por otro lado contestando a tu pregunta, hasta dónde conozco PHP, tu código primero ejecutaría el bucle y al terminar el ciclo ahí se muestra el mensaje del echo.

Por otro lado como bien dijo whk, PHP lo podes usar para páginas webs pero no para aprender un lenguaje en donda puedas y quieras hacer de todo, ya que PHP solo funciona para ser ejecutado en navegadores.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

MinusFour

Cita de: Daniel 🇦🇷 en 14 Octubre 2020, 16:30 PM
Hola, a tu código le falta el incremento, tiene el while y la condición, pero no tiene el incremento de valor en la variable $number solo tiene en el "do" pero eso se ejecuta una sola vez, la variable $number no tiene el incremento ni al lado del while ni dentro del bucle.

Por otro lado contestando a tu pregunta, hasta dónde conozco PHP, tu código primero ejecutaría el bucle y al terminar el ciclo ahí se muestra el mensaje del echo.

Saludos

No, si hay un incremento en el ciclo. El ciclo se ejecuta por lo menos una vez. En este caso, la comparación sigue siendo verdadera, así que vuelve a ejecutar el ciclo (que sigue incrementado el valor).

Cita de: WHK en 14 Octubre 2020, 08:19 AM
Generalmente cuando trabajas mucho tiempo con NodeJS uno se acostumbra que casi todo es asincrónico, de hecho si haces un .each() a una pila de datos verás que el loop se ejecuta de manera asyncrona por defecto

Va a depender de que tipo de pila de datos estamos hablando. Las estructuras de datos las puedes recorrer de ambas maneras. Con bases de datos tiene sentido trabajarlo de manera asíncrona. NodeJS no tiene un each que yo recuerde, eso me suena a una librería externa.

Yo diría que no es lo común para la mayoría de las estructuras de datos. Solo aquellas para I/O.