¿Cuál es la diferencia entre desarrollar aplicaciones web usando Java y PHP?

Wow, tuve esta regla larga y detallada que compara y contrasta Java y PHP. Estaba a punto de hacer clic en “escribir respuesta”, cuando me di cuenta de que tanto las respuestas existentes como las mías suponían que su pregunta era sobre cuál es mejor, cuando en realidad lo que realmente preguntó es cuál es la diferencia.

Lo siguiente no aborda las diferencias en el nivel de abstracción del lenguaje, el rendimiento, la escalabilidad, el soporte de API, la disponibilidad de herramientas o el tamaño del grupo de talentos del desarrollador o el mercado laboral.

Nota: JSP significa Java Server Page. PHP originalmente significaba “Página de inicio personal”, pero ahora es “PHP: preprocesador de hipertexto”. En uso general, parece común decir “una página PHP”, mientras que en el mundo de Java la gente simplemente dice “un JSP”.

Una página PHP es muy análoga a un JSP. Cualquiera de los dos es un archivo lleno de contenido con scripts opcionalmente integrados, delimitados por etiquetas especiales de inicio / finalización. Dentro de los scripts incrustados hay una fuente PHP o una fuente Java.

Los JSP también admiten etiquetas especiales basadas en XML para hacer muchas cosas, proporcionar un mejor soporte de herramientas para permitir que los que no son programadores agreguen interactividad a un JSP y disminuir la tentación de los programadores de hacerse fanáticos del Java incorporado. Sin embargo, las etiquetas JSP admiten tantas o más complicaciones, por lo que es dudoso que realmente hayan logrado este segundo objetivo.

Cuando envía una solicitud HTTP a un servidor apache para una URL con una extensión de archivo .php, el servidor apache (y mod_php) carga el archivo y lo ejecuta y devuelve cualquier texto (con suerte HTML) que imprime el script PHP en el archivo fuera.

Cuando envía una solicitud HTTP a un motor de servlet de Java para una URL con una extensión de archivo .jsp, el motor de servlet (y el compilador JSP) carga el archivo y lo ejecuta y devuelve cualquier texto (con suerte HTML) que imprime el JSP.

Sin embargo, ambos casos son, por supuesto, un poco más complicados.

Modelo de carga de página

No conozco el modelo subyacente para la interpretación de páginas PHP en el mismo grado que sé cómo se compilan las páginas JSP en la fuente de servlet java y la clase de servlet java instanciada y ejecutada en la memoria, etc. Sin embargo, en general:

Cuando se carga la página PHP, cualquier contenido no incluido en la etiqueta PHP se imprime en la conexión del navegador. Cualquier fragmento del archivo delimitado por etiquetas PHP se interpretará como script PHP. Si ese script PHP contiene una declaración de impresión, todo lo impreso se enviará a la conexión del navegador. Si ese PHP contiene una definición de función u objeto, esa función o definición de objeto se ejecuta y la función u objeto está disponible para cualquier script en la página.

Los scripts PHP pueden importar otros archivos PHP que definen funciones y objetos.

No existe una diferencia concreta entre una página PHP orientada al usuario y un archivo PHP de biblioteca de funciones o clases, excepto que el archivo función / clase no genera directamente ningún resultado para enviar al usuario y no está referenciado por algún otro usuario página o el mecanismo index.php. Los archivos importados también pueden tener contenido o scripts PHP de nivel superior que imprimen contenido, en cualquier caso, el contenido se enviará de vuelta a la conexión del navegador en la página PHP de importación.

Tenga en cuenta que hay herramientas PHP especiales que hacen más almacenamiento en caché de PHP, y estoy seguro de que apache y mod_php hacen algunas cosas inteligentes, posiblemente con almacenamiento en caché, para mejorar el rendimiento también. No sé cuáles son los detalles. Conozco el modelo para JSP / servlets, porque eso es obligatorio por la especificación del servlet.

Si bien una página PHP es el componente básico de una aplicación PHP, los JSP son en realidad secundarios en las aplicaciones web Java. Los JSP se compilan en servlets de Java. Los servlets llegaron primero, los JSP se agregaron más tarde y, en general, estaban destinados a ser una forma rápida de escribir servlets muy superficiales y orientados a la presentación.

Un servlet es una clase Java que el motor de servlet crea instancias y sigue ejecutándose en la memoria, entre solicitudes del navegador. Un archivo con una extensión de “.jsp” se compila en la fuente de Java para un servlet, y esa fuente se compila en el código de bytes de Java. Cada línea que no es de script se traduce en una simple declaración de impresión. En su forma más simple, un JSP da como resultado una clase de servlet que tiene un método único que contiene un montón de declaraciones de impresión.

Cuando un navegador envía una solicitud HTTP a un motor de servlet de Java para que una URL configurada en el motor de servlet se asocie con una instancia de una clase de servlet particular, el motor de servlet comprueba si el servlet se ha solicitado antes, y si entonces, conecta la solicitud a la instancia de servlet en memoria ya en ejecución asociada con esa URL.

Cuando un navegador envía una solicitud HTTP a un motor de servlet Java para una URL con una extensión de archivo .jsp, el motor de servlet (y el compilador JSP) verifica si el archivo JSP se ha solicitado antes y, de ser así, conecta la solicitud a la instancia de servlet en memoria ya en ejecución asociada con ese JSP. Si aún no se ha solicitado la página JSP, el servidor (y el compilador JSP) cargará el archivo, lo compilará en la fuente Java, compilará la fuente Java, creará una instancia y ejecutará el código de bytes Java resultante, conectará la solicitud a la instancia de servlet en ejecución para ese JSP, y envíe de vuelta cualquier texto (con suerte HTML) que imprima el servlet del JSP.

Los JSP se pueden precompilar antes de agruparlos en una aplicación web de Java antes de la implementación en un servidor de producción, y esto generalmente se hace con fines de rendimiento y pruebas.

Estado

HTTP no tiene estado, pero las aplicaciones web PHP y Java proporcionan un mecanismo de sesión incorporado similar para permitirle almacenar datos entre solicitudes.

El servidor establece una cookie en su navegador que contiene una ID de sesión, un valor único (no verdaderamente único, pero en términos matemáticos, lo suficientemente cerca), que el navegador luego incluye con cualquier solicitud posterior al servidor.

Cuando una página PHP almacena datos en la sesión, los datos se almacenan en el lado del servidor, en un mecanismo marcado por ese valor único. Cuando una solicitud posterior del navegador llega con el mismo valor de cookie y ejecuta una página PHP, la página PHP puede solicitar datos de la sesión. El servidor proporciona datos asociados con ese valor de ID de sesión.

Hasta donde yo sé, los datos de la sesión de PHP se guardan en la memoria, aunque no me sorprendería si existen mecanismos opcionales para diferentes tipos de almacenes de respaldo para los datos de la sesión. Ciertamente, hay una gran cantidad de tiendas de respaldo de sesión diferentes disponibles para aplicaciones web de Java, según el motor de servlet o el servidor de aplicaciones que utilice.

Las aplicaciones web Java tienen un mecanismo de sesión similar, así como varios otros mecanismos de sesión; pueden almacenar datos por solicitud http, por sesión de usuario, por aplicación web y en todo el servidor.

Además, los servlets de Java son inherentemente con estado, la clase se instancia y se guarda en la memoria entre solicitudes.

Los servlets de Java también son inherentemente multiproceso, lo que significa que la instancia de clase DEBE estar preparada para manejar múltiples solicitudes simultáneamente. Esto significa que si la clase configura cualquier estado compartido en variables de instancia, múltiples subprocesos pueden acceder a ese estado compartido en cualquier momento dado. La mayoría de las aplicaciones web Java están diseñadas para evitar eso, confiando en el mecanismo de sesión y otras técnicas para proporcionar una mejor gestión de estado segura para subprocesos.

En general, con una aplicación web java (una “aplicación web” es un concepto definido en la especificación de servlet java como un paquete coherente de servlets java, páginas JSP, activos estáticos, clases y bibliotecas java, configuraciones, etc.) las páginas JSP son Los servlets orientados a la presentación y codificados para fines sirven como policías de tráfico, reciben solicitudes, crean instancias e invocan clases de lógica Java, ocultan los resultados en los datos de la sesión y luego reenvían el control a las páginas JSP para extraer los resultados y enviarlos en medio de HTML.

Este enfoque general se llama “Modelo 2”, basado en el concepto de MVC, y existen muchos marcos de aplicaciones web de Java que reimplementan el Modelo 2 y MVC como una capa adicional en la parte superior de la especificación del servlet.

API y bibliotecas

Como se mencionó en la introducción, realmente no estoy abordando el soporte de API, pero; en PHP, si está orientado a la web, probablemente ya haya una biblioteca para hacerlo. Es posible que no disfrute usar esa biblioteca, pero probablemente esté allí. Java tiene una gran variedad de API para realizar todo tipo de tareas no orientadas a la web. Si está trabajando en menos tareas de vainilla webby, puede que le resulte mucho más fácil hacerlo en Java.

Una vez dicho todo lo anterior, en estos días se acepta con bastante regularidad el éxito en el desempeño de subcontratar una porción estratégica de su conjunto de características a un servidor independiente y acceder a él a través de una solicitud HTTP interna u otro protocolo de red. Un enfoque híbrido de una aplicación web front-end de usuario en un lenguaje más fácil, usando un servicio web para acceder a un servidor Java de back-end “pesado” es mucho menos probable que suscite sorpresa.

Bases de datos

Tanto las páginas PHP como las aplicaciones web Java suelen utilizar bases de datos para la persistencia de datos a largo plazo. En mi experiencia (que de ninguna manera es exhaustiva), las aplicaciones PHP tienden a depender más de la base de datos, cargando la mayoría de los datos de la base de datos con cada solicitud, lo que resulta en más “abandono de la base de datos”. Las aplicaciones PHP que se ocupan de cargas más altas generalmente pasan rápidamente a usar un mecanismo de almacenamiento en caché en memoria más elaborado, siendo Memcached una de las herramientas más populares cuando lo examiné por última vez, hace unos años.

Las aplicaciones web Java suelen depender más del estado de sesión en memoria. Si bien esto disminuye la pérdida de memoria y probablemente disminuye el tiempo de espera de E / S por solicitud, también significa aumentar el uso de memoria por usuario, lo que presenta un riesgo de limitaciones de escalamiento de la sobrecarga de memoria.

Tenga en cuenta que estas dos tendencias pueden ser simplemente el resultado de la tendencia a que las aplicaciones web Java se utilicen en aplicaciones empresariales menos públicas y más orientadas a la cuenta del usuario en comparación con las aplicaciones PHP que se utilizan en contextos más públicos. O esa tendencia puede ser simplemente un artefacto de mi propia experiencia.

Los servidores de aplicaciones web Java (generalmente llamados motores de servlet o servidores de aplicaciones) generalmente proporcionan conexiones de bases de datos agrupadas para fines de rendimiento. Un mecanismo estándar para esto se define en la especificación del servlet. Menciono esto principalmente porque es un error clásico de principiante no usar un grupo de conexiones y puede tener un gran impacto en el rendimiento de las aplicaciones web de Java. Cualquier discusión sobre el rendimiento de la aplicación web de Java que no incluye habitualmente el uso (o al menos el análisis) de la agrupación de conexiones de bases de datos es profundamente defectuosa.

URL y mapeo

Con PHP, la asignación de URL a PHP está bastante definida por la estructura del directorio, los nombres de directorio y los nombres de archivo y la extensión de archivo (.php). No es imposible que sucedan cosas más inteligentes, que se invoquen páginas php detrás de escena y que aparezcan rutas aparentes en la URL que no requieren la existencia de directorios y archivos equivalentes. Pero no parece hacerse con tanta frecuencia.

El mundo de las aplicaciones web de Java, por otro lado, se equivoca en la otra dirección. Si bien la especificación del servlet de Java proporciona inherentemente mucha flexibilidad para definir qué ruta de URL conduce a qué servlet, y de hecho requiere que los defina en sus archivos de configuración, muchas personas descartan esa flexibilidad y usan un marco que define un solo punto de entrada, y poner su configuración en otro archivo XML que utiliza el marco.

Marcos

Tanto el mundo de las aplicaciones web de PHP como el de Java tienen una gran cantidad de piñatas, sin esperar, eso es una gran cantidad de marcos. La moda del marco comenzó de nuevo en el mundo de Java y luego infectó el mundo de PHP. El mundo de Java tiene muchos más marcos y mucho más tiempo y energía gastados en marcos. Creo que los marcos están demasiado enfatizados, por lo que no es un punto negativo que no sean tan universalmente recomendados en el mundo PHP.

Hosting

El soporte de PHP está disponible de forma fácil y ubicua en el alojamiento apache en todo Internet. mod_php es prácticamente un módulo predeterminado en una instalación de apache. Hay algunos pasos que debe seguir el administrador del sistema, en particular la configuración del soporte para que php acceda a la base de datos elegida. Pero incluso hacerlo usted mismo en un sistema Linux moderno es bastante fácil, y casi todo el alojamiento básico incluye automáticamente PHP y soporte de base de datos de fábrica.

El soporte de alojamiento Java solía ser casi exclusivamente roll-your-own. Incluso los proveedores de hosting que afirmaban apoyarlo realmente no ofrecían mucho en cuanto a soporte. Sin embargo, en estos días hay mucho más soporte de alojamiento Java. Pero la mayoría de los servidores Java asumen un nivel inicial más alto de alojamiento; Un servidor virtual o alojamiento en la nube. Prácticamente no encontrará el alojamiento java disponible en ningún tipo de entorno de alojamiento web compartido o básico. Esto se debe en gran parte al hecho de que es más fácil cometer un error y consumir en exceso los recursos en una aplicación web de Java, y es más difícil aislar a los usuarios en un entorno de alojamiento compartido contra los errores de la aplicación web de Java de otro usuario.

Voy a guardar temporalmente mi odio por muchos elementos de PHP y solo hablaré de las diferencias a un alto nivel.

PHP es mucho, mucho más fácil de comenzar y significativamente más fácil de desarrollar que Java para la gran mayoría de los casos de uso.

Java está más estructurado, a menudo es un error en la web. La profundidad de las clases y estructuras repetitivas y de datos, etc. a menudo es exagerada, al igual que tratar con bibliotecas e importar frascos y empacar cosas, etc.

PHP está relativamente desestructurado, y a menudo también es un error en la web.

Tampoco es óptimo fuera de la caja en mi opinión.

Java es mejor para la empresa, ya que puede garantizar un nivel de estabilidad y facilidad de mantenimiento tanto en la producción como en el código al que es propicio, pero creo que a menudo puede entrar en modo de código de espagueti excesivo si no se gestiona correctamente. Este problema se aplica a Java en general, pero más a la web que al desarrollo general.

PHP necesita aplicar capas de rigor para crear aplicaciones sólidas y mantenibles, y necesita parches y adiciones para mejorar su estabilidad en un entorno de producción.

Muchos de estos ya existen, pero deben buscarse y aplicarse, y eliminan cierto grado de la facilidad de uso que proporciona PHP.

A fin de cuentas, aunque amo Java y tengo muchas disputas con PHP, generalmente prefiero PHP para la web entre los dos.

La gente odia PHP porque la gente usa PHP. Período.

Si echas un vistazo a algunos de los nuevos marcos php. Son bastante robustos con documentación fantástica. (¡Mira a Laravel y Zend!)

Entonces, diría que la respuesta de Shail está muy sesgada hacia Java. 😛

En realidad, depende principalmente de qué tipo de aplicación web desea crear y sus características. Depende de la cantidad de aplicaciones web seguras que desee. (Dicho esto, si desea una aplicación más segura y robusta, puede ir con opciones relacionadas con Java en lugar de ir con PHP). ¡Depende de muchas otras cosas también!

Consideraría los frameworks de JavaScript como un fuerte competidor de estas tecnologías en los próximos años. (¡Eche un vistazo a Angular, Meteor y Famo.us!)

Editar : ¡ Prepárense! PHP7 llegará en octubre de 2015 . Y con un modo de escritura estricto y varias otras mejoras. Dedos cruzados. ^ _ ^

En comparación con PHP, el lenguaje J2EE es mucho más fácil de mantener en términos de actualización de una aplicación o sitio web. Está muy orientado a objetos, mientras que OOP en PHP es bastante nuevo, ya que principalmente es scripting. Java también tiene un mejor rendimiento lineal. Y por lo tanto, también supera a PHP en los puntos de referencia de rendimiento.
En encuestas y según la mayoría de los programadores, J2EE es mejor para aplicaciones empresariales. Una de las razones es que Java es un lenguaje más poderoso, ya que el desarrollador / programador puede recurrir a muchas otras API de Java para realizar tareas complejas. Para hacer esto en PHP, uno tiene que buscar los complementos existentes y descargarlos. Por lo tanto, aunque PHP puede ser más fácil de aprender, J2EE es más fácil de usar.
La escalabilidad siempre es importante al decidir un idioma para una aplicación en particular. J2EE se usa principalmente para aplicaciones a gran escala, mientras que PHP se usa principalmente para aplicaciones más pequeñas.
En términos de framework, solo Java lo tiene. PHP ofrece solo algunas herramientas para que el programador trabaje. Para concluir, la documentación y el soporte de Java son mucho más sólidos que los encontrados para PHP.

Espero que esto ayude 🙂
Gracias por A2A.

Java es mejor para las grandes empresas, ya que puede garantizar un nivel de seguridad y practicidad tanto en curso como en el código para el que es útil, sin embargo, creo que con frecuencia puede entrar en modo innecesario de código de espagueti en exceso si no se supervisa legítimamente. Este problema se aplica a Java por regla general, pero más a la web que la mejora general.

PHP necesita capas de minuciosidad conectadas para crear aplicaciones sólidas y viables, y necesita correcciones y aumentos para mejorar su estabilidad en una situación de creación.

A partir de ahora existe un número significativo de estos, sin embargo, deben buscarse y conectarse, y eliminan cierto nivel de la comodidad que brinda PHP.

Las cosas son lo que son, a pesar del hecho de que adoro Java y tengo numerosas disputas con PHP, en general me inclino hacia PHP para la web entre los dos.

La mayoría de las personas encontrarán que PHP es mucho más fácil para comenzar. PHP está muy “con las baterías incluidas”, todavía estoy sorprendido * ahora * de las cosas que acaba de incorporar sin descargar bibliotecas, etc.

Sin embargo, PHP es un lenguaje hecho para una página de inicio personal, no está hecho para aplicaciones grandes de nivel empresarial. La sintaxis es un poco rápida y sucia, lo cual está bien si solo está haciendo algunas páginas, pero no si está escribiendo 10,000 líneas de código.

Java es un lenguaje mejor que PHP en todos los aspectos, pero a veces no quieres algo mejor, quieres algo fácil, que funcione. No todos están construyendo grandes sistemas que mantendrán durante 10 años, están construyendo algo que funciona * en este momento *. Para ese PHP, se adapta a mucha gente.

Personalmente, nunca usaría PHP como mi back-end completo, pero haría solo las cosas de cara a la web en PHP, con el resto del código escrito en otra cosa.

Java usa muchos frameworks. El front-end generalmente se desarrolla utilizando uno de los frameworks JS como vaadin, sencha, etc. También implica el uso de Hibernate y spring framework para persistencia, ORM, etc. Nunca he desarrollado una aplicación web con php, así que no puedo decir nada en caso de php.

Tengo una pregunta.

Si he experimentado resoruces de Java. ¿Cuál es la mejor tecnología que debo elegir para desarrollar una aplicación web, no es empresarial, es un portal web? Mis prioridades son un menor esfuerzo y un tiempo de comercialización más rápido, y tengo recursos Java experimentados y puedo encontrar personas PHP con experiencia en el mercado. Por favor aconséjame.

More Interesting

¿Cuáles son los consejos para un mejor desarrollo de aplicaciones web en 2017?

Cómo construir una API privada para mi aplicación

¿Qué tan difícil es crear, comercializar y mantener una aplicación web que genere $ 1000 por mes solo con Google Adsense (y otros)?

Si tuviera que iniciar una nueva aplicación web a gran escala hoy, ¿qué marco utilizaría?

¿Los usuarios habituales tienen miedo de los inicios de sesión sociales y más bien crean cuentas para pequeñas aplicaciones web?

Los autores del libro 'El manual del hacker de aplicaciones web' parecen asumir que las víctimas son mujeres. ¿Se considera esto sexista?

¿Cuál es la capacidad clave del proveedor para desarrollar una aplicación web integral?

¿Hay algún lector de libros electrónicos fácil de usar y basado en navegador?

¿Puedo llamarme ingeniero de pila completa si creé una aplicación web con React y Python / Flask?

Cómo encontrar probadores beta

¿Qué pasos adicionales tomaría para escalar con el tiempo una aplicación web (por ejemplo, comercio electrónico) de 10 visitas por día a 10,000,000?

¿Hay una API o algo para obtener la imagen del artículo principal de una página web?

¿Cuál es el marco subyacente o qué tecnología se utiliza para construir WhatsApp Web?

¿Qué lleva más tiempo construir un sitio web o una aplicación móvil?

¿Cuáles son algunos buenos libros para el desarrollo web si ya eres programador y has tenido alguna exposición al desarrollo web con PHP antes?