descargas contador clicks php

descargas - contador de clicks php



La mejor forma de implementar un contador de descargas? (5)

Supongamos que un usuario hace clic en un enlace para descargar un archivo. El usuario obtiene el cuadro Guardar como diálogo pero luego hace clic en cancelar. ¿Cómo se detecta esto? Es decir, si el usuario pulsa el enlace Cancelar o no obtiene el archivo completo, el servidor no debe registrar que el archivo se descargó.


¿Estás hablando de algún archivo? Si se trata de un programa, ¿puede hacer que realice una llamada al servidor durante la instalación? Aparte de eso, estoy de acuerdo con Jonathan, no estoy seguro de que tengas acceso a eso.


Creo que algunos HTTPd no registran los archivos en el registro de acceso hasta que la solicitud se completa. Podría intentar escribir algo que analiza el registro, greps el nombre de archivo y cuenta el número de líneas.

Edición: acabo de probar con nginx. Confirmó mi teoría. Creo que lo mismo es cierto para Apache.

Editar # 2: ¿Por qué se modificó esto? En realidad es la respuesta correcta de acuerdo con el dupe-link en SO. Estoy de pie vindicado.


Una forma sería escribir algo de PHP que maneje la entrega del archivo en cuestión proporcionado como un parámetro $ _REQUEST. Ese script haría el trabajo real de registrar la descarga


En el pasado, he hecho esto:

header(''Content-Description: File Transfer''); header(''Content-Type: application/octet-stream''); header(''Content-Disposition: attachment; filename=''.basename($file)); header(''Content-Transfer-Encoding: binary''); header(''Expires: 0''); header(''Cache-Control: must-revalidate, post-check=0, pre-check=0''); header(''Pragma: public''); header(''Content-Length: '' . filesize($file)); ob_clean(); flush(); readfile($file); flush() log() exit;

el registro solo debe ejecutarse después de que se haya completado el archivo de lectura, lo que significa que todo el archivo se ha transmitido al usuario. Ha pasado un tiempo desde que hice esto y no sé dónde está el código exacto, por lo que puede no ser exacto, pero debería hacerlo funcionar.

EDITAR Encontré el código anterior en php.net y es más o menos lo que estaba describiendo, este método debería funcionar.


Cuando un servidor envía un archivo, no solo transmite por el cable al instante, hay paquetes de ack que tienen que ir entre el cliente y el servidor enviando el archivo un pedazo a la vez.

Todo lo que uno tiene que hacer es tener algún tipo de proceso que envíe el archivo al usuario de una manera administrada, de modo que pueda conectar un evento donde el "último" bloque del archivo se descargue al usuario.

Ahora bien, es posible que el usuario nunca reciba este último bloque, pero si preguntan por el último bloque (que es lo que están haciendo los paquetes ack), o bien ellos, o bien el protocolo de red subyacente ha aceptado que han recibido todos los bloques que preceden a ese bloque. último bloque, y ese puede proceder a enviar el último bloque.

Ahora suponiendo que

  1. Su servidor web no almacena en búfer.
  2. Eso cuando su servidor web bloquea la ejecución de su programa mientras transmite la información que está enviando.

Todo lo que uno necesita es una construcción simple como esta: (Pseudo Código).

1: Open File $foo; 2: Loop while $foo is not EOF 3: read 700kilobits from file $foo; 4: print 700kilobits of read data to web server 5: execute webserver ''flush'' which blocks until flush is complete. 6: <-- Loop 7: If all chunks of 700kilobits were read before user aborted transaction 8: report file was downloaded.

La respuesta de Edit Unkwntech es efectivamente la misma que la mía.
Sin embargo, su respuesta es específica de PHP y quería proporcionar una solución más genérica para el lenguaje, principalmente porque he desarrollado un disgusto por PHP, y no quiero escribir un código para ello y configurar un servidor web y probarlo. solo para demostrar un punto que sé por experiencia funciona.
Disculpas por ser demasiado flojo a este respecto.