2011-06-20 7 views
30

¿Qué es mejor? Tengo mi propio registro de MySQL, así que tiene unos 90 MB, pero no estoy seguro de cuál debo usar. Abre el archivo EVERYTIME hay una consulta para ejecutar.¿Qué es más rápido? file_put_contents(); fopen(); fwrite(); fclose() ;?

¿Qué es más rápido?

+4

Ejecute sus propios puntos de referencia. Estoy seguro de que no lleva horas abrir un archivo de 90 MB. – BoltClock

+0

no. Ese es el problema, estoy en host compartido y está en producción, así que no puedo simplemente "probarlo". – genesis

+0

Puede probar en su máquina de desarrollo local. – KingCrunch

Respuesta

35

Según this article, el fwrite() es un smidgen más rápido. (Enlace a Wayback Machine, porque el sitio ya no existe.)

Mi conjetura es que file_put_contents() es sólo una envoltura alrededor de todos modos estos tres métodos, por lo que perdería la cabeza.

EDIT: This site tiene la misma información.

+0

-1 ¿Cómo puede ser incluso una respuesta solo refiriéndose a un sitio que ya no existe? Podría haber citado el sitio o artículos de referencia de él. Votación negativa – TheBlackBenzKid

+0

Er, el sitio existía hace un año. Probablemente debería cambiar eso a algo más reciente. – hwrdprkns

+1

El artículo original aún se puede ver en Wayback Machine: http://web.archive.org/web/20100109103851/http://balancedbraces.com/2008/06/12/fopen-fwrite-fclose-vs-file_put_contents/ –

5

Como de costumbre, ¿lo ha comparado? file_put_contents es básicamente un envoltorio alrededor de las 3 f*() llamadas de todos modos, por lo que a lo sumo se pierde haciendo una llamada de función adicional, pero gana un poco teniendo menos código de front-end para analizar.

22

Esta función es idéntica a llamar sucesivamente a fopen(), fwrite() y fclose() para escribir datos en un archivo.

Comprobar la documentación: http://php.net/manual/en/function.file-put-contents.php

Shaun

+0

http://www.php.net/downloads.php también podría tomar la fuente para obtener el meollo de la cuestión, debería ayudar a responder este tipo de preguntas. – shaunhusain

+1

Miré en la fuente un poco más, parece que fwrite usa directamente php_stream_write de streams.c, siempre que no esté utilizando ninguna de las características de zend, la llamada a file_put_contents también terminará (después de hacer algunos controles para Zend flags) llame a php_stream_write, como otros han declarado que probar esto (incluso si no está en producción pero en una caja de prueba) es la mejor manera de responder la pregunta y variará para escenarios particulares. – shaunhusain

8

depende del uso de los casos. Abrí archivos de más de .5 GB y no quería usar file() ni file_get_contents(); Y file_put_contents no pudo funcionar porque también necesitaba leer el archivo.

Si realmente está interesado en agregar un archivo sin leer, no importa demasiado; si intenta leer un archivo completo en la memoria (o escribir un archivo completo desde la memoria), de igual manera no importa: la ganancia de velocidad, por lo que he visto, es un error de redondeo.

PERO, si está esperando que estos archivos lleguen a ser bestias gigantescas, o si solo necesita un pequeño subconjunto del número de líneas de un archivo determinado, no puedo sugerir el uso de fopen (o el SplFileObject, que es IMPRESIONANTE) lo suficientemente fuerte - es realmente fácil de leer desde el medio de un archivo con estos.


Puesto que usted está solo registro, por otro lado, yo, personalmente, resulta más claro y conciso simplemente usar file_put_contents con la bandera de anexos. Les permite a todos saber lo que está sucediendo sin tener que mirar dos veces.

+0

bien, gracias. Como estoy escribiendo con mi script – genesis

+0

@genesis. Lo siento, hoy tengo problemas con mi máquina de trabajo (puede que tenga algo que ver con el proceso de pago masivo de SVN, pero lo que sea), y no pude conseguir esa adición antes de que la viera. – cwallenpoole

6
  1. Si sólo hay una escritura de operación para un archivo de una solicitud, file_put_contents es mejor que fwrite, porque ha wrappered abierta, escribir y funciones de cierre, y tan rápido como fwrite.
  2. Si hay varias escrituras para un archivo en una solicitud, primero necesitamos abrir el archivo y luego escribir varias veces, por lo que fwrite es más rápido. Pero, si es un sistema muy ocupado, que tiene muchos "archivos abiertos" (ulimit -a | grep "archivos abiertos"), file_put_contents será una opción más razonable, ya que mantiene el manejador de archivos más corto que fwrite.
Cuestiones relacionadas