windos+apache性能优化

0 条评论

公司中现有多个apache平台,其中网元管理系统、升级和注册授权系统、离线浏览系统和应用组所开发的系统都是运行在专用的服务器中,他们都是以业务为主的系统,所拥有的硬件资源比较多,可以着重优化apache的运行速度,以适当的资源换取更高的运行速度
但是设备中运行的各个配置程序,他们是以性能为主的系统,所运行的环境就要相对恶劣,硬件资源限制非常多,不能供web程序随意使用,他们的优化方向应该是保证运行速度的基础上尽力压低资源消耗
受限于此,很多外挂式加速程序都无法使用了,比如memcache、eaccelerator等,使用这些工具的前提就是内存足够大,或者资源足够多, 通常是专用的apache服务器上才会用到,也就是我们的第一类系统中才可以使用的,在一个嵌入系统中使用其实是得不尝失的。下面将着重研究两种情况都使 用的优化方法。

二、运行环境
无论何时,apache所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给apache一个单独的主机以免受到其他应用的干扰。但很明显,我们的配置页面程序无法满足这个要求。
各个硬件指标中,对性能影响最大的是内存,对于静态内容(图片、javascript文件、css文件等),它决定了apache可以缓存多少内容,它 缓存的内容越多,在硬盘上读取内容的机会就越少,而存取硬盘上的特定文件是一件很费时的操作,大内存可以极大提高静态站点的速度;对动态高负载站点来说, 每个请求保存的时间更多一些,apache的mpm模块会为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正比,因此增 大内存对提高动态站点的负载和运行速度也极为有利
其次是硬盘的速度,静态站点尤为突出,apache不断的在读取文件并发送给相应的请求,硬盘的读写是极其频繁的;动态站点也要不断的加载web程序 (php等),一个请求甚至要读取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高apache的性能是有积极意义的。
最后是cpu和网络,cpu影响的是web程序执行速度,网络影响流量大小。
影响性能的另一因素是操作系统,php程序在类unix环境中的执行速度仍然比windows中要快.

三、apache普通配置参数
1、静态还是动态
使用apache的动态载入模块非常方便,因为在需要时模块才会被载入。虽然有些性能开销,但同时有利于减少服务器对内存的需求。
静态载入虽然一次性载入所有需要的模块,增加内存消耗。因此我们全部采用动态载入的方法。

2、Hostnamelookups off
域名查找:这增加了处理每个请求的开销,首先,服务器会对dns系统做一个反向查询以找出客户系统的主机名,然后又进行正向查询看获得的主机名是否真实 指向客户的ip。大多数情况下,你可以简单的关闭这个功能,如果你经常处理服务器日志,这个工作完全可以在以后进行。你可以通过在设置文件中加入指示 hostnamelookups off来关闭这个功能。

3、Options -followsymlinks
符号连接:当打开这个选项时,apache将检查每个请求中是否包含对符号连接的引用,这将对请求中包含的每个路径调用一次lstat()系统调用。除非你准备使用符号连接,否则用 options -followsymlinks 来关掉它。

4、sethandler server-status
服务器状态信息,默认已经关闭。该模块尽管这对测试与监控服务器很有用,但它也为服务器带来了额外的开销,你可以通过寻找任何类似sethandler server-status的指示来关闭,如果可能,你可以在安装apache时移除这个模块。

5、Options -indexes
关闭目录浏览

6、directoryindex index.php index.html
在可以更精确的时候尽可能不要使用通配符之类的灵活选项,删除不需要的选项,明确的指定设置文件列表,最常用的放在最前。

7、cgi模块
除非你有很好的理由否则就允许cgi的执行,将似有的cgi文件放到一个特定的目录并为之设定正确的权限,这避免了apache对每一个请求都要判断一次要求的是一个静态文件还是一个动态文件。

8、写入日志
写入日志信息是一个很花费时间的工作,apache保持日志文件的打开状态以节省打开文件的时间,如果没有必要存储日志信息,你可以关闭这个选项以节省出更多的处理器时间,只需要在设置文件中把日志那一行注释掉就可以关掉它。
如果必须保留日志,你可以关闭hostnamelookups选项(见上文)然后把日志文件拷备到另一台机器上做进一步分析。

9、allowoverride none
.htaccess文件可以极大的扩展apache的设置参数,而无需每次你改变设计都要编辑apache主设置文件,但对这个文件的使用也降低了服务器的性能。
如果使用这个文件,apache必需首先在当前目录中查找是否存在这个文件,如果存在就解析这个文件并在当前目录中应用文件中的设置。更坏的 是,apache不仅要查看当前的目录,还要查看当前目录的所有上层目录是否包括htaccess文件以根据所有这些文件最终确定设置。
如果你想最优化服务器的性能,你应该禁止使用htaccess文件,任何基本目录的设置都可以在主设置文件中进行,而主设置文件仅在服务器启动时解析一次。为了禁用htaccess文件,在任何节里加上指示allowoverride none。

10、timeout 5
timeout 设置 apache 等待一个连接读写操作的时间长度,也就是连接建立后,apache 等待客户端完成请求发送的时间,或者是响应开始之后,apache 写出数据到客户端连接的时间长度。
无论对于哪种应用来说,300秒的缺省值都有些过长了,因为这就意味着,如果客户端发生了某种未知因素导致的迟滞的话,服务器的一个连接和与之对应的所 有资源都要维持 300 秒,这个对于重载的服务器来说是在是有些过长,所以,我建议将其设置得小一些,这个长度只要足够保证各种客户端的应用能够正常传递数据即可。这里需要考虑 的因素主要有各种客户端的连接状况和服务器的繁忙程度。一般来说,我建议设置为 3~5。

11、keepalive on
这个选项明确 httpd 进程对每个请求的链接是否保持长链接。如果保持长链接,则从同一个客户端的连续两次请求会使用同一个连接,而不用重复发送请求。
对于下载类的应用,因为连接时间都比较长,因此这个值设置成 on 还是 off 关系不大,从节约每一滴资源角度考虑,可以设置为 off。
对于网页类应用来说,如果你的静态页面上有一些图标、图片、和js、css等东西的话,并且如果有超过两个的资源的话,我建议是设置为 on。

12、maxkeepaliverequests 100
最多保持多少个活动的长链接

13、 keepalivetimeout 5
连接的保持时间,超过时间就回收
apache进程在使用内存时,是“渐长”的。也就是说,直到这个进程死掉,使用内存的数量是一直增长而不会减少的。这样的话,apache进程使用内存的多少,就决定于你的应用程序最大使用内存量了。
keepalivetimeout 这个参数决定了,在什么都不做之前,一个http进程能够等待多长时间?设想一下,如果keepalive设置为on,而 keepalivetimeout设置为一个比较大的数字,apache占用内存会很快的增长。这是因为,一个apache进程完成了一个任务(并达到了 一定的内存占用,想一下“渐进”模式),并不会马上退出,而是等待一个keepalivetimeout时间。假设用户的链接请求持续不断的到来,则积累 起来的无用的apache进程就会相当多,直到timeout,这些进程才会被杀死。
但是,keepalive的确对于静态的文件,比如图像文件的传送是很有效的,因此,keepalive要设置为on,但是keepalvietimeout要设置的小些,比如5s

14、serversignature off
默认情况下,很多apache安装时会显示版本号及操作系统版本,甚至会显示服务器上安装的是什么样的apache模块。这些信息可以为黑客所用,并且黑客还可以从中得知你所配置的服务器上的很多设置都是默认状态。
所以,请加入如下两条:
serversignature off
servertokens prod
serversignature 出现在apache所产生的像404页面、目录列表等页面的底部。servertokens目录被用来判断apache会在server http响应包的头部填充什么信息。如果把servertokens设为prod,那么http响应包头就会被设置成:server:apache


四、MPM模块

多处理方式(multi-processing module/mpm)他允许特定平台处理多个并发连接

apache的mpm模块可运行在多种模式之下,其中beos、mpmt_os2分别是beos和os/2上缺省的mpm, perchild主要设计目的是以不同的用户和组的身份来运行不同的子进程。这在运行多个需要cgi的虚拟主机时特别有用,会比1.3版中的suexec 机制做得更好。leader和threadpool都是基于worker的变体,还处于实验性阶段,某些情况下并不会按照预期设想的那样工作,所以 apache官方也并不推荐使用。因此,我们主要阐述prefork和worker这两种和性能关系最大的产品级mpm ( 有关其它的mpm详细说明,请参见apache官方文档:http://httpd.apache.org/docs-2.0/mod/)。

1、prefork的工作原理及配置
prefork就是unix平台上缺省的mpm。它所采用的预派生子进程方式也是 apache 1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不 同的请求,进程之间是彼此独立的,这也使其成为最稳定的mpm之一。
如果是使用debian的apt安装的apache,使用"apache2ctl -l"来确定当前使用的mpm,应该会看到prefork.c(如果看到worker.c说明使用的是worker mpm,依此类推),在apache2.conf中可以找到这一段配置

<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>

prefork的工作原理是,控制进程在最初建立"StartServers"个子进程后,为了满足"MinSpareServers"设置的需要创建一 个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销 以增加性能。

MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,apache会自动kill掉一些多余进程。这个值不要设得过大,但 如果设的值比MinSpareServers小,apache会自动把其调整为MinSpareServers+ 1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。

MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了"MaxRequestsPerChild" 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
可防止意外的内存泄漏;
在服务器负载下降的时侯会自动减少子进程数。
因此,可根据服务器的负载来调整这个值。但也不能太小,不然系统不断的开启新的apache进程,造成资源浪费。

MaxClients是这些指令中最为重要的一个,设定的是apache可以同时处理的请求,是对apache性能影响最大的参数。其缺省值 150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而http访问却很慢的主要原因。系统管理员可以根据硬件配置 和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但apache默认的限制不能大于256。如果把这个值设为大于256,那么 apache将无法起动。事实上,256对于负载稍重的站点也是不够的。在apache 1.3中,这是个硬限制。如果要加大这个值,必须在“configure”前手工修改的源代码树下的src/include/httpd.h中查找 256,就会发现“#define hard_server_limit 256”这行。把256改为要增大的值(如4000),然后重新编译apache即可。在apache 2.0中新加入了serverlimit指令,使得无须重编译apache就可以加大maxclients。

<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 600
MaxClients 300
MaxRequestsPerChild 600
</IfModule>

2、worker的工作原理及配置

相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的mpm。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种mpm的工作方式将是apache 2.0的发展趋势。

<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

worker的工作原理是,由主控制进程生成"startservers"个子进程,每个子进程中包含固定的"threadsperchild"线程数, 各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,minsparethreads和maxsparethreads设置了最少和最多的空闲 线程数;而maxclients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

minsparethreads和maxsparethreads的最大缺省值分别是75和250。这两个参数对apache的性能影响并不大,可以按照实际情况相应调节。

threadsperchild是worker mpm中与性能相关最密切的指令。threadsperchild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 threadlimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:

究竟是选取prefork还是worker需要具体分析,相对而言高负载下perfork拥有更高的稳定性和运行速度,而worker的资源消耗更小。也 已经有人在对两种工作模式作了各种测试:http://jed.dzhope.com/read.php/298.htm

实际情况看来,worker现在还没能达到所期望的效果,性能比frefork差一些,资源消耗少一点。更可惜的是debian下worker还不能与PHP5完美结合,所以只能选用perfork了。

五、性能测试
为了获得优化有性能提高的幅度,评估优化工作的成效,需要对apache2服务器进行测试。
测试环境:
apache2和php5服务器:debian4.0、apache2.2.3、 php5.2.0-8+etch0、256M内存
在另一台机器上使用apachebench工具模拟多个浏览器向服务器的测试页面发起HTTP请求,为了减少网络带宽的影响,测试页面的返回值尽可能的 小,此处只有1 byte,并为发起测试的机器和服务器组建了一个单独的局域网。每种并发测试11次,以后10次的结果为准,取平均值。
以下是测试的数据:其中并发数是指apachebench同时发起的请求个数,优化前和优化后是指平均每个请求花费的处理时间,单位毫秒

       并发数
优化前(毫秒)
优化后(毫秒)
10
2.048
1.7549
50
2.1389
1.927
100
2.2084
1.9238
200
2.7689
2.5915
400
3.0523
2.797

需要指出的是,尽管高负载时优化后性能提高的百分比并不明显,但在并发数400时,测试18次失败7次,而优化后测试14次失败3次。优化不仅仅提高了服务器的性能,还提高了负载的能力。

六、结论

优化可以有效的提高apache2的性能。
对于WMS等设备上的配置页面,第三部分的“apache普通配置参数”可以应用,MPM主要是以资源换取速度的优化,可以酌情调整。
对于EMS、升级系统和应用系统,可以全面优化以提高性能和高负载能力。
2009-06-07 / 服务器 / none 阅读全文

Apache服务器的性能优化

0 条评论

通过挤出Apache服务器的每一分潜力你可以让你的网站留给别人的印象大大改观,特别是对一些动态网站更是如何。这篇文章主要涉及到对Apache服务器的安装和设置如何进行优化,这也是你最有控制权的部分。

          影响Apache服务器性能的方面很多,Apache所在的机器与操作系统环境是对性能影响最大因素,这里我们主要讲一下提高Apache服务器速度的一些通常做法以及它如何与构成WEB网站的其它组件进行交互。

一、apache普通配置参数

1、静态还是动态
      使用apache的动态载入模块非常方便,因为在需要时模块才会被载入。虽然有些性能开销,但同时有利于减少服务器对内存的需求。
静态载入虽然一次性载入所有需要的模块,增加内存消耗。因此我们全部采用动态载入的方法。

2、优化静态内容
      如果你的WEB服务器使用了大量静态内容或者你分别用两个WEB服务器处理动态和静态内容,那么你现在的主要目标就是缩短服务器发送被请求内容的响应时间,最简单的方法就是使用mod_cache缓存模块。你可以使用mod_disk_cache和mod_mem_cache来分别提供基于磁盘的缓存和基于内存的缓存。

3、配置mod_expires模块(这个非常有用的优化哦) ,使用前注意开启mod_expires
      mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。除开用户有发送no-cache才会更新,但要注意更新快的文件不要这么做.
      mod_expires的安装配置:

ExpiresActive On
ExpiresDefault A60
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A2592000
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A604800
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A60


4、Hostnamelookups off
      域名查找:这增加了处理每个请求的开销,首先,服务器会对dns系统做一个反向查询以找出客户系统的主机名,然后又进行正向查询看获得的主机名是否真实指向客户的ip。大多数情况下,你可以简单的关闭这个功能,如果你经常处理服务器日志,这个工作完全可以在以后进行。你可以通过在设置文件中加入指示hostnamelookups off来关闭这个功能。

5、Options -followsymlinks
     符号连接:当打开这个选项时,apache将检查每个请求中是否包含对符号连接的引用,这将对请求中包含的每个路径调用一次lstat()系统调用。除非你准备使用符号连接,否则用 options -followsymlinks 来关掉它。

6、sethandler server-status
      服务器状态信息,默认已经关闭。该模块尽管这对测试与监控服务器很有用,但它也为服务器带来了额外的开销,你可以通过寻找任何类似sethandler server-status的指示来关闭,如果可能,你可以在安装apache时移除这个模块。

7、Options -indexes
       关闭目录浏览

8、directoryindex index.php index.html
       在可以更精确的时候尽可能不要使用通配符之类的灵活选项,删除不需要的选项,明确的指定设置文件列表,最常用的放在最前。

9、cgi模块
        除非你有很好的理由否则就允许cgi的执行,将似有的cgi文件放到一个特定的目录并为之设定正确的权限,这避免了apache对每一个请求都要判断一次要求的是一个静态文件还是一个动态文件。

10、写入日志
        写入日志信息是一个很花费时间的工作,apache保持日志文件的打开状态以节省打开文件的时间,如果没有必要存储日志信息,你可以关闭这个选项以节省出更多的处理器时间,只需要在设置文件中把日志那一行注释掉就可以关掉它。
        如果必须保留日志,你可以关闭hostnamelookups选项(见上文)然后把日志文件拷备到另一台机器上做进一步分析。

11、allowoverride none
       .htaccess文件可以极大的扩展apache的设置参数,而无需每次你改变设计都要编辑apache主设置文件,但对这个文件的使用也降低了服务器的性能。
       如果使用这个文件,apache必需首先在当前目录中查找是否存在这个文件,如果存在就解析这个文件并在当前目录中应用文件中的设置。更坏的是,apache不仅要查看当前的目录,还要查看当前目录的所有上层目录是否包括htaccess文件以根据所有这些文件最终确定设置。
      如果你想最优化服务器的性能,你应该禁止使用htaccess文件,任何基本目录的设置都可以在主设置文件中进行,而主设置文件仅在服务器启动时解析一次。为了禁用htaccess文件,在任何节里加上指示allowoverride none。

12、timeout 5
        timeout 设置 apache 等待一个连接读写操作的时间长度,也就是连接建立后,apache 等待客户端完成请求发送的时间,或者是响应开始之后,apache 写出数据到客户端连接的时间长度。
        无论对于哪种应用来说,300秒的缺省值都有些过长了,因为这就意味着,如果客户端发生了某种未知因素导致的迟滞的话,服务器的一个连接和与之对应的所有资源都要维持 300 秒,这个对于重载的服务器来说是在是有些过长,所以,我建议将其设置得小一些,这个长度只要足够保证各种客户端的应用能够正常传递数据即可。这里需要考虑的因素主要有各种客户端的连接状况和服务器的繁忙程度。一般来说,我建议设置为 3~5。

13、keepalive on
        这个选项明确 httpd 进程对每个请求的链接是否保持长链接。如果保持长链接,则从同一个客户端的连续两次请求会使用同一个连接,而不用重复发送请求。
       对于下载类的应用,因为连接时间都比较长,因此这个值设置成 on 还是 off 关系不大,从节约每一滴资源角度考虑,可以设置为 off。
对于网页类应用来说,如果你的静态页面上有一些图标、图片、和js、css等东西的话,并且如果有超过两个的资源的话,我建议是设置为 on。

14、maxkeepaliverequests 100
        最多保持多少个活动的长链接

15、 keepalivetimeout 5
        连接的保持时间,超过时间就回收apache进程在使用内存时,是“渐长”的。也就是说,直到这个进程死掉,使用内存的数量是一直增长而不会减少的。这样的话,apache进程使用内存的多少,就决定于你的应用程序最大使用内存量了。
        keepalivetimeout 这个参数决定了,在什么都不做之前,一个http进程能够等待多长时间?设想一下,如果keepalive设置为on,而 keepalivetimeout设置为一个比较大的数字,apache占用内存会很快的增长。这是因为,一个apache进程完成了一个任务(并达到了一定的内存占用,想一下“渐进”模式),并不会马上退出,而是等待一个keepalivetimeout时间。假设用户的链接请求持续不断的到来,则积累起来的无用的apache进程就会相当多,直到timeout,这些进程才会被杀死。
         但是,keepalive的确对于静态的文件,比如图像文件的传送是很有效的,因此,keepalive要设置为on,但是keepalvietimeout要设置的小些,比如5s

16、serversignature off
        默认情况下,很多apache安装时会显示版本号及操作系统版本,甚至会显示服务器上安装的是什么样的apache模块。这些信息可以为黑客所用,并且黑客还可以从中得知你所配置的服务器上的很多设置都是默认状态。
所以,请加入如下两条:
serversignature off
servertokens prod

        
        serversignature 出现在apache所产生的像404页面、目录列表等页面的底部。servertokens目录被用来判断apache会在server http响应包的头部填充什么信息。如果把servertokens设为prod,那么http响应包头就会被设置成:server:apache

17、gzip压缩,这个能减少带宽流量,具体配置见http://www.chenggang.net/post/78/


二、MPM模块

          多处理方式(multi-processing module/mpm)他允许特定平台处理多个并发连接apache的mpm模块可运行在多种模式之下,其中beos、mpmt_os2分别是beos和os/2上缺省的mpm, perchild主要设计目的是以不同的用户和组的身份来运行不同的子进程。这在运行多个需要cgi的虚拟主机时特别有用,会比1.3版中的suexec 机制做得更好。leader和threadpool都是基于worker的变体,还处于实验性阶段,某些情况下并不会按照预期设想的那样工作,所以 apache官方也并不推荐使用。因此,我们主要阐述prefork和worker这两种和性能关系最大的产品级mpm ( 有关其它的mpm详细说明,请参见apache官方文档:http://httpd.apache.org/docs-2.0/mod/)。

1、prefork的工作原理及配置
        prefork就是unix平台上缺省的mpm。它所采用的预派生子进程方式也是 apache 1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的mpm之一。
        如果是使用debian的apt安装的apache,使用"apache2ctl -l"来确定当前使用的mpm,应该会看到prefork.c(如果看到worker.c说明使用的是worker mpm,依此类推),在apache2.conf中可以找到这一段配置
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>


        prefork的工作原理是,控制进程在最初建立"StartServers"个子进程后,为了满足"MinSpareServers"设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。
        MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,apache会自动把其调整为MinSpareServers+ 1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
        MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了"MaxRequestsPerChild" 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
a.可防止意外的内存泄漏;
b.在服务器负载下降的时侯会自动减少子进程数。

          因此,可根据服务器的负载来调整这个值。但也不能太小,不然系统不断的开启新的apache进程,造成资源浪费。
MaxClients是这些指令中最为重要的一个,设定的是apache可以同时处理的请求,是对apache性能影响最大的参数。其缺省值 150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而http访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但apache默认的限制不能大于256。如果把这个值设为大于256,那么 apache将无法起动。事实上,256对于负载稍重的站点也是不够的。在apache 1.3中,这是个硬限制。如果要加大这个值,必须在“configure”前手工修改的源代码树下的src/include/httpd.h中查找 256,就会发现“#define hard_server_limit 256”这行。把256改为要增大的值(如4000),然后重新编译apache即可。在apache 2.0中新加入了serverlimit指令,使得无须重编译apache就可以加大maxclients。
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 600
MaxClients 300
MaxRequestsPerChild 600
</IfModule>


2、worker的工作原理及配置

         相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的mpm。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种mpm的工作方式将是apache 2.0的发展趋势。
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>


           worker的工作原理是,由主控制进程生成"startservers"个子进程,每个子进程中包含固定的"threadsperchild"线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,minsparethreads和maxsparethreads设置了最少和最多的空闲线程数;而maxclients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

            minsparethreads和maxsparethreads的最大缺省值分别是75和250。这两个参数对apache的性能影响并不大,可以按照实际情况相应调节。

            threadsperchild是worker mpm中与性能相关最密切的指令。threadsperchild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 threadlimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:

           究竟是选取prefork还是worker需要具体分析,相对而言高负载下perfork拥有更高的稳定性和运行速度,而worker的资源消耗更小。也已经有人在对两种工作模式作了各种测试:http://jed.dzhope.com/read.php/298.htm

            实际情况看来,worker现在还没能达到所期望的效果,性能比frefork差一些,资源消耗少一点。更可惜的是debian下worker还不能与PHP5完美结合,所以只能选用perfork了。

2009-06-07 / 服务器 / none 阅读全文

Apache 性能优化调整

0 条评论

Apache音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在美国的西南部。相传阿帕奇是一个武士,他英勇善战,且战无不胜,被印第安人奉为勇敢和胜利的代表,因此后人便用他的名字为印第安部落命名,而阿帕奇族在印第安史上也以强悍著称。Apache是世界使用排名第一的Web服务器。它可以运行在几乎所有广泛使用的计算机平台上。

  在进行web性能容量规划的时候首先利用Apahce首先计算内存消耗:

  apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2

  apache_max_process = apache_max_process_with_good_perfermance * 1.5

  为什么会有一个apache_max_process_with_good_perfermance和apache_max_process呢?原因是在低负载下系统可以使用更多的内存用于文件系统的缓存,从而进一步提高单个请求的响应速度。在高负载下,系统的单个请求响应速度会慢不少,而超过 apache_max_process,系统会因为开始使用硬盘做虚拟内存交换空间而导致系统效率急剧下降。此外,同样的服务:2G内存的机器的 apache_max_process一般只设置到1G内存的1.7倍,因为Apache本身会因为进程过多导致性能下降。

  例子1:

  一个apache + mod_php的服务器:一个apache进程一般需要4M内存

  因此在一个1G内存的机器上:apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500

  apache_max_process = 500 * 1.5 = 750

  所以规划你的应用让服务尽量跑在500个进程以下以保持比较高的效率,并设置Apache的软上限在800个。

  例子2:

  一个apache + mod_resin的服务器: 一个apache进程一般需要2M内存

  在一个2G内存的机器上:

  apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000

  apache_max_process = 2000 * 1.5 = 3000

  Apache所在的机器与操作系统环境是对性能影响最大因素,很明显,一以368的PC与一台P4或双处理器的机器不会有同样的性能。不过,如果不涉及硬件的改变,我们可以做的最大的事是首先看一下Apache是否运行在一台专用的服务器上,如果与其它应用共用一台服务器肯定会影响服务器的性能。

  在大多数情况下,告别是对静态网站而言,内存数量是一个影响性能的关键因素,因为它决定了Apache可以缓存多少内容。它缓存的内容越多,在硬盘上读取内容的机会就越少,而存取硬盘上的特定文件是一件很费时的操作。如果你的网站主要是一些静态内容,你最好使用mod_cache选项,如果你的内存足够大,可以使用mod_mem_cache选项。

  第一个选项将信息缓存在磁盘上,当它与mod_include选项一起使用时会有很好的效果,这个选项在建立一个页面时在缓存中保存它的最终版本。使用mod_mem_cache将缓存内容保存在一个可以被所有Apache进程共享的内存堆中。

  使用更快的磁盘或进一步使用RAID可以提高Apache对磁盘文件的访问速度。注意,如果你做了下面的所有这些优化,一个硬件的(而非软件)升级方案是更好的选择。最后一个谈到的关于硬件的问题是CPU能力,这对动态内容网站的影响很大,动态内容越多要求越高。

  以下是影响Apache的性能配置参数:

  Timeout  300

  指定站点响应的时间秒数。若超过这段时间仍未收到或送出数据,就断开连接。意思是该参数指定Apache在接收请求或发送所请求内容之前的最长等待时间(秒),若超过该时间Apache则放弃处理该请求,并释放连接。该参数默认值为120,推荐设置为60,对于访问量较大的网站可以设置为30。

  KeepAlive On|Off

  启用此项,表示允许保持持久连接,让每次连接能提出多个请求。避免每请求一个文件就跟服务器建立一次连接。也就是控制Apache是否允许在一个连接中有多个请求,默认打开。但对于大多数论坛类型站点来说,通常设置为off以关闭该支持。

  MaxKeepAliveRequests 100

  每次连接可提出请求的数量,设置为0表示数量不限,默认值为100。.

  KeepAliveTimeout 15

  连续两个请求之间的时间如果超过15秒还未到达,则视为连接中断。这种做法可以最大限度地利用有限的资源,这也是Apache性能如此优越的原因之一。

  MinSpareServers 5

  MaxSpareServers 20

  Apache在运行时会根据负载的轻重自动调整空闲子进程的数目。

  提供浏览服务的httpd进程的数目需要随连接数目的多少而变化,因此需要随时保持几个闲置的httpd进程等候新的连接请求。若闲置的进程数少于5个(默认值),则表示闲置进程太少,需要将其增加到5个;

  若多于20个(默认值)则表示闲置进程太多,需将其减少到20个。

  MaxClients 150

  同时接入的数目太多时会降低系统访问性能,设置此参数可限制同时连接的最大数值,默认值为150,它设定的就是Apache可以同时处理的请求,这是对Apache性能影响最大的参数

  MaxClients和MaxRequestPerchild;MaxClients指定Apache在同一时间内最多允许有多少客户端能够与其连接,如果超过MaxClients个连接,客户端将会得到一个“服务器繁忙”的错误页面。我们看到默认情况下MaxClients设置为15,这对一些中型站点和大型站点显然是远远不够的!也许您需要同时允许512个客户端连接才能满足应用需求,好吧,那么就让我们把MaxClients修改为512,保存httpd.conf并退出,重启Apache,很遗憾,在重启过程当中您看到了一些错误提示,Apache重启失败。错误提示中告诉您 MaxClients最大只能设定为256,相信您一定很失望。不过不要沮丧,Apache作为世界一流的Web Server一定不会如此单薄的!在默认情况下,MaxClients的确只能设定为不超过256的整数,但是,如果您有需要完全可以随意定制,此时就需要使用ServerLimit参数来配合使用,简单的说ServerLimit就像是水桶,而MaxClients就像是水,您可以通过更换更大的水桶(将ServerLimit设定为一个较大值)来容纳更多的水(MaxClients),但要注意,MaxClients的设定数值是不能大于 ServerLimit的设定数值的!下面让我们了解一下MaxRequestPerChild参数,该参数指定一个连接进程中可以有多少个线程同时工作。也许这样解释过于专业,那么您只要想想“网络蚂蚁”、“网际快车FlashGet”中的“多点同时下载”即可,该参数实际上就是限制最多可以用几个“点”。默认设置为0,即为:不限制。但需要注意,如果将该值设置的过小会引起访问问题,如果没有特殊需要或者访问量压力并非很大可以保持默认值,如果访问量很大则推荐设置为2048

  优化建议:

  # 升级 Apache 到最新版本,新版本往往包含性能提升和安全更新。

  # 在 httpd.conf 中设置 "HostNameLookups off" 能避免针对每个访问者的 DNS 域名的反向查询。

  # 对于繁忙的网站,在 httpd.conf 中设置 "MaxClients 230" 或者更高。这项设置让更多的 httpd 进程同时响应请求,并避免了处理器排队的情况发生。

  # 采用另外一台服务器处理图片文件。

  # 缺保您的 Web 页面和 CGI 页面采用了浏览器缓冲技术。具体的文章可以参考本站:采用 mod_gzip 加速 Zope 和 Apache

  # 保持您的 Apache 苗条,编译那些仅仅需要的模块,在编译之前,修改 src/Configuration 文件,在那些不需要的模块之前用 # 号注释掉。

  # 如果不需要流量日志,那么把 httpd.conf 中的 TransferLog 指向到 /dev/null/

  # 除非你确定使用 .htaccess 文件来控制一些目录的权限,否则设置 "AllowOverride None" ,这样就免去 Apache 在每个目录搜索 .htaccess 文件的劳役之苦。

  # 不要让不需要的后台进程运行。

  # 千万不要把页面或者日志文件写到网络磁盘上,例如 NFS。

  # 不要让 Apache (httpd) 运行于 inetd 模式。

  # 不要让 X Windows 运行在你的 Web 服务器上,用 Ctrl-Alt-Backspace 关闭 X 。

  # 避免使用 SSI tag。

  # 在 CGI 脚本中:

  * 文件 I/O:打开的文件数目越少越好。

  * Shell 命令:采用全路径来调用 shell 命令。

  * 如果你的网站主要以 CGI 来驱动,那么请使用 mod_perl。

  * 在你的 Web 页面目录中,不要让文件数超过 1000 个,文件越多花费在定位上的时间也越多。

  # 在 Web 服务器上的图片越少越好,保证每个图片都经由图片压缩器运行。

  # 对你的网站做压力测试,建议采用 Apache 自带的 ab 命令来测试。

  # 为了最好的性能,最好把网线拔掉,这样你的 Web 服务器就十分安全,而且负载马上降为 0,

2009-06-06 / 服务器 / none 阅读全文

sablog远程图片本地化功能hack

0 条评论

主要实现了把提交的文章中如<img src="XXXX.jpg" XXXX/>的图片抓回服务器保存为文章的附件。

并且可以本地上传的图片附件一样进行管理。

修改在sablogx 1.6 1.6 Build 20071004下通过测试

ps:如果内容中有很多张引用的远程图片是同一个地址的,则只保存一份,节约服务器空间。嘿嘿。

并且会把<img src="XXXX.jpg" XXXX/>的内容替换成相应附件id的sablog表述,如

<span style="color: #000000"><span style="color: #007700">[</span><span style="color: #0000bb">attach</span><span style="color: #007700">=</span><span style="color: #0000bb">id</span><span style="color: #007700">]</span> </span>

废话不说了,看代码吧。

加入article.php中的代码,因为有修改文章和新增文章两种,这里我只是简单的同样代码复制两份来解决。其实也可以抽出来做个单独的php吧。

<span style="color: #000000"><span style="color: #ff8000">//保存远程图片<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;code&nbsp;by&nbsp;suddy<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Thanks&nbsp;for&nbsp;angel,喜悦国际村&amp;xd888<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$attachs&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">$attach_data&nbsp;</span><span style="color: #007700">=&nbsp;array();</span><span style="color: #ff8000">//由于可能远程未被触发,所以要先声明$attachs数组<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(!empty(</span><span style="color: #0000bb">$saveremoteing</span><span style="color: #007700">)){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$gd_version&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">gd_version</span><span style="color: #007700">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$content&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">stripslashes</span><span style="color: #007700">(</span><span style="color: #0000bb">$content</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$img_array&nbsp;</span><span style="color: #007700">=&nbsp;array();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//获取输入内容中的远程图片部分<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$ismatch</span><span style="color: #007700">=</span><span style="color: #0000bb">preg_match_all</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;/(src|SRC)=[\&quot;|'|&nbsp;]{0,}(http:\/\/(.*)\.(gif|jpg|jpeg|bmp|png))/isU&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">$content</span><span style="color: #007700">,</span><span style="color: #0000bb">$img_array</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">$ismatch</span><span style="color: #007700">!=</span><span style="color: #0000bb">0</span><span style="color: #007700">){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">set_time_limit</span><span style="color: #007700">(</span><span style="color: #0000bb">0</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$imgUrl&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">$options</span><span style="color: #007700">[</span><span style="color: #dd0000">'attachments_dir'</span><span style="color: #007700">];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$yearMonth&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">strftime</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;%Y%m&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">time</span><span style="color: #007700">());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$imgPath&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">SABLOG_ROOT</span><span style="color: #007700">.</span><span style="color: #0000bb">$imgUrl</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;/date_&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$yearMonth</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$milliSecond&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">strftime</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;%H%M%S&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">time</span><span style="color: #007700">());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!</span><span style="color: #0000bb">is_dir</span><span style="color: #007700">(</span><span style="color: #0000bb">$imgPath</span><span style="color: #007700">))&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span style="color: #0000bb">mkdir</span><span style="color: #007700">(</span><span style="color: #0000bb">$imgPath</span><span style="color: #007700">,</span><span style="color: #0000bb">0777</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fnamehash&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">md5</span><span style="color: #007700">(</span><span style="color: #0000bb">uniqid</span><span style="color: #007700">(</span><span style="color: #0000bb">microtime</span><span style="color: #007700">()));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$oldvalue</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;suddy&quot;</span><span style="color: #007700">;</span><span style="color: #ff8000">//赋初值是为了后续判断中strpos函数不会在第0个位置找到而返回0的时候被解释成false<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">foreach(</span><span style="color: #0000bb">$img_array</span><span style="color: #007700">[</span><span style="color: #0000bb">2</span><span style="color: #007700">]&nbsp;as&nbsp;</span><span style="color: #0000bb">$key&nbsp;</span><span style="color: #007700">=&gt;</span><span style="color: #0000bb">$value</span><span style="color: #007700">)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$value&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">trim</span><span style="color: #007700">(</span><span style="color: #0000bb">$value</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//判断是否是重复图片,如果重复,只保存一份<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(</span><span style="color: #0000bb">strpos</span><span style="color: #007700">(</span><span style="color: #0000bb">$oldvalue</span><span style="color: #007700">,</span><span style="color: #0000bb">$value</span><span style="color: #007700">)==</span><span style="color: #0000bb">false</span><span style="color: #007700">){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$oldvalue</span><span style="color: #007700">=</span><span style="color: #0000bb">$oldvalue</span><span style="color: #007700">.</span><span style="color: #0000bb">$value</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$get_file&nbsp;</span><span style="color: #007700">=&nbsp;@</span><span style="color: #0000bb">file_get_contents</span><span style="color: #007700">(</span><span style="color: #0000bb">$value</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">$get_file</span><span style="color: #007700">)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//获取远程图片文件名<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">preg_match_all</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;(((=|\)|\(|&amp;|\^|%|$|!|@|\+|-|\w)*)\.(gif|jpg|jpeg|bmp|png))&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">$value</span><span style="color: #007700">,</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">=</span><span style="color: #0000bb">addslashes</span><span style="color: #007700">(</span><span style="color: #0000bb">strtolower</span><span style="color: #007700">(</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">[</span><span style="color: #0000bb">0</span><span style="color: #007700">][</span><span style="color: #0000bb">0</span><span style="color: #007700">]));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//获取远程图片大小<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fileSize&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">getRemoteFileSize</span><span style="color: #007700">(</span><span style="color: #0000bb">$value</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//因为实在不清楚filetype要怎么获取,手工构造了,大大们多多指点<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fileType</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">preg_match_all</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;(jpg)&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">,</span><span style="color: #0000bb">$typetemp</span><span style="color: #007700">))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fileType</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;image/jpg&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">preg_match_all</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;(jpeg)&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">,</span><span style="color: #0000bb">$typetemp</span><span style="color: #007700">))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fileType</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;image/jpeg&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">preg_match_all</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;(gif)&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">,</span><span style="color: #0000bb">$typetemp</span><span style="color: #007700">))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fileType</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;image/gif&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">preg_match_all</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;(png)&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">,</span><span style="color: #0000bb">$typetemp</span><span style="color: #007700">))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fileType</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;image/png&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">preg_match_all</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;(bmp)&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">,</span><span style="color: #0000bb">$typetemp</span><span style="color: #007700">))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fileType</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;image/bmp&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//构造filepath字段,该字段以$options['attachments_dir']为根<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">=</span><span style="color: #0000bb">split</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;(\.)&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">=</span><span style="color: #0000bb">strtolower</span><span style="color: #007700">(</span><span style="color: #0000bb">$ext</span><span style="color: #007700">[</span><span style="color: #0000bb">1</span><span style="color: #007700">]);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">$ext</span><span style="color: #007700">==</span><span style="color: #dd0000">&quot;jpg&quot;</span><span style="color: #007700">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;jpg&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">$ext</span><span style="color: #007700">==</span><span style="color: #dd0000">&quot;jpeg&quot;</span><span style="color: #007700">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;jpeg&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">$ext</span><span style="color: #007700">==</span><span style="color: #dd0000">&quot;gif&quot;</span><span style="color: #007700">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;gif&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">$ext</span><span style="color: #007700">==</span><span style="color: #dd0000">&quot;bmp&quot;</span><span style="color: #007700">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;bmp&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">$ext</span><span style="color: #007700">==</span><span style="color: #dd0000">&quot;png&quot;</span><span style="color: #007700">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;png&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">$ext</span><span style="color: #007700">!=</span><span style="color: #dd0000">&quot;jpg&quot;</span><span style="color: #007700">&amp;&amp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">!=</span><span style="color: #dd0000">&quot;jpeg&quot;</span><span style="color: #007700">&amp;&amp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">!=</span><span style="color: #dd0000">&quot;gif&quot;</span><span style="color: #007700">&amp;&amp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">!=</span><span style="color: #dd0000">&quot;bmp&quot;</span><span style="color: #007700">&amp;&amp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">!=</span><span style="color: #dd0000">&quot;png&quot;</span><span style="color: #007700">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$filePath</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;/date_&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$yearMonth</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;/&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$fnamehash</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;.&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$ext</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$rndFileName&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">$imgPath</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;/&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$fnamehash</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;.&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$ext</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fileurl&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">$cache_settings</span><span style="color: #007700">[</span><span style="color: #dd0000">'siteurl'</span><span style="color: #007700">].</span><span style="color: #0000bb">$imgUrl</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;/date_&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$yearMonth</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;/&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$fnamehash</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;.&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$ext</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$fp&nbsp;</span><span style="color: #007700">=&nbsp;@</span><span style="color: #0000bb">fopen</span><span style="color: #007700">(</span><span style="color: #0000bb">$rndFileName</span><span style="color: #007700">,</span><span style="color: #dd0000">&quot;w&quot;</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span style="color: #0000bb">fwrite</span><span style="color: #007700">(</span><span style="color: #0000bb">$fp</span><span style="color: #007700">,</span><span style="color: #0000bb">$get_file</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@</span><span style="color: #0000bb">fclose</span><span style="color: #007700">(</span><span style="color: #0000bb">$fp</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//&nbsp;判断是否使用缩略图<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if(</span><span style="color: #0000bb">$imginfo</span><span style="color: #007700">=@</span><span style="color: #0000bb">getimagesize</span><span style="color: #007700">(</span><span style="color: #0000bb">$value</span><span style="color: #007700">)){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000bb">$options</span><span style="color: #007700">[</span><span style="color: #dd0000">'attachments_thumbs'</span><span style="color: #007700">]&nbsp;&amp;&amp;&nbsp;</span><span style="color: #0000bb">$gd_version</span><span style="color: #007700">)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$size&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">explode</span><span style="color: #007700">(</span><span style="color: #dd0000">'x'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000bb">strtolower</span><span style="color: #007700">(</span><span style="color: #0000bb">$options</span><span style="color: #007700">[</span><span style="color: #dd0000">'attachments_thumbs_size'</span><span style="color: #007700">]));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$attachsubdir</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;/date_&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$yearMonth</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;/&quot;</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((</span><span style="color: #0000bb">$imginfo</span><span style="color: #007700">[</span><span style="color: #0000bb">0</span><span style="color: #007700">]&nbsp;&gt;&nbsp;</span><span style="color: #0000bb">$size</span><span style="color: #007700">[</span><span style="color: #0000bb">0</span><span style="color: #007700">]&nbsp;||&nbsp;</span><span style="color: #0000bb">$imginfo</span><span style="color: #007700">[</span><span style="color: #0000bb">1</span><span style="color: #007700">]&nbsp;&gt;&nbsp;</span><span style="color: #0000bb">$size</span><span style="color: #007700">[</span><span style="color: #0000bb">1</span><span style="color: #007700">])&nbsp;&amp;&amp;&nbsp;</span><span style="color: #0000bb">$fileSize&nbsp;</span><span style="color: #007700">&lt;&nbsp;</span><span style="color: #0000bb">2048000</span><span style="color: #007700">)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$attach_thumb&nbsp;</span><span style="color: #007700">=&nbsp;array(<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'filepath'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$rndFileName</span><span style="color: #007700">,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'filename'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$fnamehash</span><span style="color: #007700">,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'extension'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$ext</span><span style="color: #007700">,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'attachsubdir'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$attachsubdir</span><span style="color: #007700">,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'thumbswidth'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$size</span><span style="color: #007700">[</span><span style="color: #0000bb">0</span><span style="color: #007700">],<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'thumbsheight'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$size</span><span style="color: #007700">[</span><span style="color: #0000bb">1</span><span style="color: #007700">],<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$thumb_data&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">generate_thumbnail</span><span style="color: #007700">(</span><span style="color: #0000bb">$attach_thumb</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbwidth'</span><span style="color: #007700">]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;</span><span style="color: #0000bb">$thumb_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbwidth'</span><span style="color: #007700">];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbheight'</span><span style="color: #007700">]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;</span><span style="color: #0000bb">$thumb_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbheight'</span><span style="color: #007700">];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbfilepath'</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #0000bb">$attachsubdir</span><span style="color: #007700">.</span><span style="color: #0000bb">$thumb_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbfilepath'</span><span style="color: #007700">];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #ff8000">//缩略图处理完毕<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;把文件信息插入数据库<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$isimage</span><span style="color: #007700">=</span><span style="color: #0000bb">1</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$DB</span><span style="color: #007700">-&gt;</span><span style="color: #0000bb">query</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;INSERT&nbsp;INTO&nbsp;{$db_prefix}attachments&nbsp;(articleid,filename,filesize,filetype,filepath,dateline,downloads,isimage,thumb_filepath,thumb_width,thumb_height)&nbsp;VALUES&nbsp;('&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$articleid</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;',&nbsp;'&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;',&nbsp;'&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$fileSize</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;',&nbsp;'&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">addslashes</span><span style="color: #007700">(</span><span style="color: #0000bb">$fileType</span><span style="color: #007700">).</span><span style="color: #dd0000">&quot;',&nbsp;'&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">addslashes</span><span style="color: #007700">(</span><span style="color: #0000bb">$filePath</span><span style="color: #007700">).</span><span style="color: #dd0000">&quot;',&nbsp;'$timestamp',&nbsp;'0',&nbsp;'1',&nbsp;'&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbfilepath'</span><span style="color: #007700">].</span><span style="color: #dd0000">&quot;',&nbsp;'&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbwidth'</span><span style="color: #007700">].</span><span style="color: #dd0000">&quot;','&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbheight'</span><span style="color: #007700">].</span><span style="color: #dd0000">&quot;')&quot;</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$aidtmp&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">$DB</span><span style="color: #007700">-&gt;</span><span style="color: #0000bb">insert_id</span><span style="color: #007700">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$attachs</span><span style="color: #007700">[</span><span style="color: #0000bb">$aidtmp</span><span style="color: #007700">]&nbsp;=&nbsp;array(<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'attachmentid'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$aidtmp</span><span style="color: #007700">,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'dateline'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$timestamp</span><span style="color: #007700">,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'filename'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">addslashes</span><span style="color: #007700">(</span><span style="color: #0000bb">$fileName</span><span style="color: #007700">),<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'filetype'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">addslashes</span><span style="color: #007700">(</span><span style="color: #0000bb">$fileType</span><span style="color: #007700">),<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'filepath'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">addslashes</span><span style="color: #007700">(</span><span style="color: #0000bb">$filePath</span><span style="color: #007700">),<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'filesize'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">addslashes</span><span style="color: #007700">(</span><span style="color: #0000bb">$fileSize</span><span style="color: #007700">),<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'downloads'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">0</span><span style="color: #007700">,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'thumb_filepath'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbfilepath'</span><span style="color: #007700">],<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'thumb_width'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbwidth'</span><span style="color: #007700">],<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'thumb_height'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">[</span><span style="color: #dd0000">'thumbheight'</span><span style="color: #007700">],<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #dd0000">'isimage'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000bb">$isimage<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset(</span><span style="color: #0000bb">$isimage</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset(</span><span style="color: #0000bb">$attach_data</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//$s=addslashes(serialize($attachs));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//$searcharray[]&nbsp;=&nbsp;'[localfile='.$localid[$key].']';<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//$searcharray[]&nbsp;=&nbsp;'[localfile='.$localid[$key].']';<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//$replacearray[]&nbsp;=&nbsp;'[attach='.$aidtmp.']';<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//$tobereplace=addslashes($tobereplace)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$content&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">ereg_replace</span><span style="color: #007700">(</span><span style="color: #dd0000">&quot;&lt;(img|IMG)[^&gt;]*(SRC|src)(\s)*=(\s)*[\&quot;|'|&nbsp;]&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$value</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;[\&quot;|'|&nbsp;][^&gt;]*&gt;&quot;</span><span style="color: #007700">,</span><span style="color: #dd0000">&quot;[attach=&quot;</span><span style="color: #007700">.</span><span style="color: #0000bb">$aidtmp</span><span style="color: #007700">.</span><span style="color: #dd0000">&quot;]&quot;</span><span style="color: #007700">,</span><span style="color: #0000bb">$content</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #ff8000">//一个图片附件处理完毕<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset(</span><span style="color: #0000bb">$oldvalue</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff8000">//$content&nbsp;=&nbsp;addslashes($content);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">}</span><span style="color: #ff8000">//&nbsp;保存远程图片完毕</span> </span>

然后是uploadfiles.php中的一个小修改,去掉了$attachs的定义来让外部的$attachs数组成员直接传入使用

<span style="color: #000000"><span style="color: #ff8000">//$attachments&nbsp;=&nbsp;$attachs&nbsp;=&nbsp;$attach_data&nbsp;=&nbsp;array();</span> </span> 改为
<span style="color: #000000"><span style="color: #0000bb">$attachments&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">$attach_data&nbsp;</span><span style="color: #007700">=&nbsp;array();</span> </span>

在include下的func_attachment.php中加入了一个自定义函数来获取远程图片大小

<span style="color: #000000"><span style="color: #007700">function&nbsp;</span><span style="color: #0000bb">getRemoteFileSize</span><span style="color: #007700">(</span><span style="color: #0000bb">$url</span><span style="color: #007700">){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$url&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">parse_url</span><span style="color: #007700">(</span><span style="color: #0000bb">$url</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">$fp&nbsp;</span><span style="color: #007700">=&nbsp;@</span><span style="color: #0000bb">fsockopen</span><span style="color: #007700">(</span><span style="color: #0000bb">$url</span><span style="color: #007700">[</span><span style="color: #dd0000">'host'</span><span style="color: #007700">],empty(</span><span style="color: #0000bb">$url</span><span style="color: #007700">[</span><span style="color: #dd0000">'port'</span><span style="color: #007700">])?</span><span style="color: #0000bb">80</span><span style="color: #007700">:</span><span style="color: #0000bb">$url</span><span style="color: #007700">[</span><span style="color: #dd0000">'port'</span><span style="color: #007700">],</span><span style="color: #0000bb">$error</span><span style="color: #007700">)){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">fputs</span><span style="color: #007700">(</span><span style="color: #0000bb">$fp</span><span style="color: #007700">,</span><span style="color: #dd0000">&quot;GET&nbsp;&quot;</span><span style="color: #007700">.(empty(</span><span style="color: #0000bb">$url</span><span style="color: #007700">[</span><span style="color: #dd0000">'path'</span><span style="color: #007700">])?</span><span style="color: #dd0000">'/'</span><span style="color: #007700">:</span><span style="color: #0000bb">$url</span><span style="color: #007700">[</span><span style="color: #dd0000">'path'</span><span style="color: #007700">]).</span><span style="color: #dd0000">&quot;&nbsp;HTTP/1.1&quot;</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">fputs</span><span style="color: #007700">(</span><span style="color: #0000bb">$fp</span><span style="color: #007700">,</span><span style="color: #dd0000">&quot;Host:$url[host]&quot;</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!</span><span style="color: #0000bb">feof</span><span style="color: #007700">(</span><span style="color: #0000bb">$fp</span><span style="color: #007700">)){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">$tmp&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000bb">fgets</span><span style="color: #007700">(</span><span style="color: #0000bb">$fp</span><span style="color: #007700">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000bb">trim</span><span style="color: #007700">(</span><span style="color: #0000bb">$tmp</span><span style="color: #007700">)&nbsp;==&nbsp;</span><span style="color: #dd0000">''</span><span style="color: #007700">){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if(</span><span style="color: #0000bb">preg_match</span><span style="color: #007700">(</span><span style="color: #dd0000">'/Content-Length:(.*)/si'</span><span style="color: #007700">,</span><span style="color: #0000bb">$tmp</span><span style="color: #007700">,</span><span style="color: #0000bb">$arr</span><span style="color: #007700">)){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000bb">trim</span><span style="color: #007700">(</span><span style="color: #0000bb">$arr</span><span style="color: #007700">[</span><span style="color: #0000bb">1</span><span style="color: #007700">]);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000bb">null</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000bb">null</span><span style="color: #007700">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span> </span>

最后就是在后台模板文件templates\admin\article.php 里加入选择保存远程图片的按钮

<span style="color: #000000"><span style="color: #007700">&lt;</span><span style="color: #0000bb">input&nbsp;name</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;saveremoteing&quot;&nbsp;</span><span style="color: #0000bb">type</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;checkbox&quot;&nbsp;</span><span style="color: #0000bb">value</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;1&quot;&nbsp;</span><span style="color: #0000bb">$saveremoteing</span><span style="color: #007700">&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000bb">保存远程图片</span><span style="color: #007700">&lt;</span><span style="color: #0000bb">br&nbsp;</span><span style="color: #007700">/&gt;</span> </span>

附上几张使用图片

 

大小: 78.81 K<br />
尺寸: 400 x 220<br />
浏览: 37 次<br />
点击打开新窗口浏览全图

 

大小: 97.26 K<br />
尺寸: 400 x 350<br />
浏览: 21 次<br />
点击打开新窗口浏览全图

大小: 60.55 K<br />
尺寸: 400 x 284<br />
浏览: 36 次<br />
点击打开新窗口浏览全图

附件是所有有修改的文件。如果没修改admin目录的话直接覆盖就ok了。

ps: 使用保存远程图片的时候会比较慢一点,有大大知道如何优化的话欢迎指点。

2009-06-03 / 服务器 / none 阅读全文

Notice: Use of undefined constant XXx

0 条评论

PHP 出现Notice: Use of undefined constant 的解决方案
 
0推荐进入网站会出现大量类似下面的提示,但是可以正常显示和运行
Notice: Use of undefined constant ctbTitle - assumed 'ctbTitle' in d:\ctb1.5\ctb\include\config.php on line 23...

答案:这些是 PHP 的提示而非报错,PHP 本身不需要事先声明变量即可直接使用,但是对未声明变量会有提示。一般作为正式的网站会把提示关掉的,甚至连错误信息也被关掉

关闭 PHP 提示的方法
搜索php.ini:
error_reporting = E_ALL
改为:
error_reporting = E_ALL & ~E_NOTICE 

此例特别是要用于喜宝科技,还有那个php_admin_value open_base_dir 必须这样格式

2009-06-01 / 服务器 / none 阅读全文