怎样统计到底有多少网站使用了我的图片?(而不是单纯的浏览器打开)只要統計http請求,不需要知道是否用瀏覽器打開。你可以在tracker.php中加上$_SERVER['HTTP_REFERER'] 來獲取來源地址,即請求你這張圖的頁面的地址。
然後通過正則,獲取url的domain入庫。統計直接 group by photo 就可以了
表結構
id photo domain

解决方案 »

  1.   

    你的代码只能统计动态的请求,对于静态的 url 就无能为力了,比如 http://www.mydomain,com/1.jpeg
    正确的做法是分析 web 服务器的日志文件
      

  2.   

    楼上讲的对,如果你的图片全部都是用动态php去显示的,你的程序已经可以了。加上$_SERVER['HTTP_REFERER']获取来源。
    而静态图片则可以通过获取apache log来分析。
      

  3.   


    php分析access_log? 那个log每天都有近百MB,如果cron脚本每5分钟运行一次,怎么高效的读取log文件?(时间段:当前时间-5分钟,到当前,那么是不是也要完整读取整个log文件?)
    还有怎么做foreach?按/r/n换行还是别的?然后再正则,再放进数据库?大侠,能不能给段高效点的代码?谢谢。
      

  4.   


    哦,谢谢。小问一下,php动态读取和静态读取图片相比,是不是会花费更多的CPU,内存和IO?是不是会增加许多?
      

  5.   

    1、静态文件由 web 服务器直接读取,而php动态读取则需要先启动 php 解析程序,再由 php 程序读取
         板板脚趾头都会知道谁的效率高
    2、日志文件是只增不减的,并且已存在的内容也不会被修改。所以你只需记住上一次读到哪里,这次接着读就可以了
      

  6.   

    靜態快很多,
    php讀取會慢。
    最好用靜態。
      

  7.   

    并不是所有的虚拟主机 日志存放路径 可以自行修改的。所以你开发的这个项目,只能用于 云服务器的站长, 当然,大家对图片给谁动用了,并不觉得有什么,不是吗?中国的网络是开放的,没多少人会去在乎注意这些东西,应该应该本着共享的精神。
    如果有一天,发现图片给动用得非常多了。那么只需要一个伪静态代码,就可以把访问图片引用变成一个logo或者其它精心制作的广告图,你有没有发现有很多图片有时候显示“该图片来自 XXX站,请进入***访问”,那些都是伪静态,一句话就搞定了。只要别人引用了网站图片,那图片就会变成伪静态设定好的另外一张图片。
      

  8.   


    明白了那么怎么写一段PHP代码分析日志文件呢?循环,正则读取,然后怎么才能记住上一次读取到哪儿呢?
    SSH可以用类似 cat /var/log/httpd/access_log | grep "1.jpeg",打印出所有访问过1.jpeg的用户几百个MB的日志也就1秒钟
    PHP不懂,还得讲究效率,占用资源少。
      

  9.   

    只知道nginx服务器可以配置referer防盗链,并且自定义log,将referer写进去
    apache也肯定有
    需要php分析log的话...定时导入到sql,然后清空log如何?
      

  10.   


    准确度的话,可以用 date_default_timezone_set () 为服务器的时区,然后用getdate();获取当前时间。crontabm每一分钟执行,只要正则出当前时间前一分钟的所有记录。最主要的问题还是php如何高效的打开一个大文件的最后几条,可以多读取一点,设置每次读取为access_log的最后1000条记录。我的服务器有32GB内存,但是需要较低CPU开销。谢谢。
      

  11.   


    找到一个方法,http://httpd.apache.org/docs/2.2/programs/rotatelogs.html
    用rotatelogs每分钟生成一个新的log文件。但为什么重启apache后没有生成想要的日志呢?<IfModule log_config_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" com                                                                                        bined
        LogFormat "%h %l %u %t \"%r\" %>s %b" common
        <IfModule logio_module>
          LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I                                                                                         %O" combinedio
        </IfModule>
        CustomLog "logs/access_log" combined env=!dontlog
        CustomLog "|sbin/rotatelogs -f logs/my_log 60" combined env=!dontlog
        SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
        SetEnvIf Remote_Addr "::1" dontlog
    </IfModule>
      

  12.   

    可能与 Apache 的版本有关 http://apache.chinahtml.com/logs.html关于读取日志文件,你好像没有理解我的意思
    日志文件是不定长记录文件,在没有索引的情况下,是无法定位到指定行的
    不过自己构建索引文件也是没有必要的,毕竟日志里都是“旧闻”,读过了也就没必要再读了
    文件函数集中有:
    ftell -- 返回文件指针读/写的位置
    fseek -- 在文件指针中定位你只需在每次 fgets 之后用 ftell 读取偏移位置,并保存
    下次再读时,取回上次保存的偏移位置,用 fseek 定位
    就可接着读了一定会有人说 fgets 一次一行效率太低,但用 fread 一次一大块时,尾部的半截行,处理起来也并非易事