65.9K
CodeProject 正在变化。 阅读更多。
Home

有用的 PHP 扩展

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (14投票s)

2009年11月17日

CPOL

16分钟阅读

viewsIcon

88005

downloadIcon

5194

一篇关于一些有用的 PHP 5 扩展的文章,附带功能齐全的演示和所有必需文件

引言

在这里,您可以下载一些有用的PHP 5扩展,并附带功能齐全的演示和所有必需文件。
我的想法是让这篇文章随着时间的推移通过添加新功能和更多扩展而不断成长。

您可以在这里下载的所有代码都是编写清晰且可重用的PHP代码,可以复制并粘贴,无需更改即可集成到您的项目中。
下载内容还包含手册以及适用于LinuxWindows的必需PHP扩展。

目前本文包含以下章节

  1. 项目 1:上传进度显示
  2. 项目 2:使用MagickWand进行图像处理
  3. 项目 3:ImageCutter允许在线裁剪上传图片的一部分
  4. Wamp服务器问题
  5. 入门教程:如何在Windows (Xampp) 上运行本文中的代码
  6. 黑客安全的Web编程

项目 1:上传进度显示

此项目显示了一个或多个文件上传在浏览器中的进度。

我一直不明白为什么浏览器会显示所有当前下载的窗口,但对于上传,浏览器却什么都不显示什么都没有????
上传大文件的可怜用户根本不知道他的上传还需要10分钟,还是10个小时才能完成。
智能浏览器应该显示一个进度条和剩余时间,用于处理耗时的文件上传——就像处理下载一样。
不可思议:目前市面上没有一款浏览器具有如此有用且基本的功能!!

这真是荒谬:现在,Web开发者必须完成浏览器开发者所忽略的工作!!
这并不容易:PHP必须通过一种复杂的方式从Web服务器(例如Apache/IIS)获取上传状态。
因此,需要一个必须安装在服务器上的PHP扩展。

如果您开始搜索这个话题,您会发现很多内容。但大多数代码都有bug,无法工作,或者不支持多文件。文档通常不存在。

我决定使用名为“uploadprogress”的PHP扩展。但是这个扩展没有文档,而且它的作者提供了一个非常丑陋的演示,使用了两个IFrames。

这里有一个功能齐全的演示,具有以下特点

  • JavaScript通过Ajax从服务器获取进度信息,并每3秒更新一次显示。
  • 显示上传进度条
  • 显示上传状态:当前文件编号、已上传字节数、总字节数、当前速度、剩余时间。
  • 上传可以通过取消链接或浏览器的停止按钮来取消。
  • 在上传活动期间,整个网页将完全被阻止,呈半透明灰色,并显示等待光标。
  • 该代码已在各种浏览器上进行了测试。

上传进度 - 安装

Windows

在您可以在此处下载的ZIP文件中,您会找到php_uploadprogress.dll。将此DLL复制到您的PHP扩展文件夹(在PHP.ini中定义的extension_dir文件夹)。

在Windows上找到此DLL并不容易。您只能在极少数网站上找到已为Windows编译的DLL。在尝试了不同版本的DLL后,我发现其中大多数DLL都有各自的bug,甚至会导致Apache崩溃。我投入了数天令人沮丧的时间,才找到一个可以正确工作并运行的DLL版本!我最终在Pierre的页面上找到了它。

Linux

在ZIP文件中,您还可以找到一个包含源代码的PECL包。

上传进度 - 配置

您需要在您的PHP.ini文件中添加以下行

extension = php_uploadprogress.dll
uploadprogress.file.filename_template = C:\Program Files\xampp\tmp\info_%s.txt
uploadprogress.get_contents = 0

重要提示

模板文件的路径必须有效,并且必须包含“%s”!!
这个“%s”将被替换为上传的标识符。
对于每次上传,都会在给定文件夹中生成一个小文本文件,其中存储了下载的实际状态。该文件在上传完成后将被删除。

UploadProgress - 测试

如果您的浏览器与服务器在同一台计算机上运行(localhost),则完全不可能测试上传进度显示。
即使您上传一个100 MB的文件,您也不会看到一次显示更新。

如果您没有互联网上的Web服务器进行测试,或者您想在localhost上进行测试以便更容易调试,有一个技巧

安装Proxomitron!这是一个本地代理服务器,具有许多我在此不解释的功能。其中一个功能是显示到您的浏览器和从您的浏览器传输的流量。

在您的浏览器中,您必须在localhost端口8080上配置代理服务器,并删除localhost的任何例外。

然后在Proxomitron中,点击“Log Window”按钮,在Log Window中右键单击,然后在菜单中单击“View Posted Data”。就是这样。

现在Proxomitron显示了所有发送到您的浏览器(黄色)和来自您的浏览器(绿色)的流量。如果您将20 MB的数据上传到服务器,您将看到所有已发布的(灰色)数据。但是,如果您曾经将20 MB的数据打印到Log Window,您就会知道这有多慢。使用这个技巧,您将大大减慢数据传输速度,上传进度显示将完美工作——即使在localhost上。不要关闭Log窗口!在测试UploadProgress时,它必须一直打开。

项目 2:使用MagickWand进行图像处理

为什么不使用GD库?
PHP自带内置的GD库用于图像处理,它相当基础。它只支持GIF、JPG和PNG,并且功能很少。

几年前,当我第一次使用GD库时,我感到震惊,因为GIF支持最近已被移除!我简直不敢相信,一些PHP开发者大脑中诞生了如此疯狂的想法,竟然要移除互联网上最重要的图形格式!由于缺乏GIF支持,我决定不使用GD。几年后,他们才认识到自己的致命错误,并重新添加了GIF支持。

几个月前,我给了GD库第二次机会。但是,将一个7兆像素的图像旋转90度时,PHP会抛出内存不足的错误。我需要一个在线图像编辑器,让用户可以上传任何图像——包括他们数码相机拍摄的图像。所以GD库再次被排除。此外,GD库只提供基本功能,最终图像的质量也不是最好的。

我寻找替代方案,找到了MagickWand

  • MagickWand的编程更智能:当您处理大型图像时,它们被存储在文件映射中,而不是将所有图像数据保存在内存中。我从未在处理MagickWand时遇到过内存不足的错误。
  • MagickWand库拥有海量功能,包括透明图像操作、各种变换和滤镜。
  • Resize功能就提供了长长的滤镜列表来调整图像大小:BesselGaussianBlackmanHermiteHanningHammingCatromMitchellLanczosQuadraticCubicTrianglePointBoxSinc,……
  • 支持的图像格式列表很长:AARTAVIAVSBBIEBMPBMP2BMP3CCAPTIONCINCIPCLIPCLIPBOARDCMYKCMYKACR2CRWCURCUTDCMDCRDCXDFONTDNGDPSDPXEMFEPDFEPIEPSEPS2EPS3EPSFEPSIEPTEPT2EPT3EXRFAXFITSFRACTALFTSGG3GIFGIF87GRADIENTGRAYHISTOGRAMHTMHTMLICBICOICONINFOIPLJBGJBIGJNGJP2JPCJPEGJPGJPXKLABELMM2VMAPMATMATTEMIFFMNGMONOMPCMPEGMPGMRWMSLMSVGMTVMVGNEFNULLOORFOTBOTFPALPALMPAMPATTERNPBMPCDPCDSPCLPCTPCXPDBPDFPEFPFAPFBPFMPGMPGXPICONPICTPIXPJPEGPLASMAPNGPNG24PNG32PNG8PNMPPMPREVIEWPSPS2PS3PSDPTIFPWPRRAFRASRGBRGBARGBORLARLESCRSCTSFWSGISHTMLSTEGANOSUNSVGSVGZTEXTTGATHUMBNAILTIFFTIFF64TILETIMTTCTTFTXTUILUYVYVDAVICARVIDVIFFVSTWBMPWMFWMFWIN32WMZWPGXX3FXBMXCXCFXPMXVXWDYYCbCrYCbCrAYUV
  • 最终图像的质量是极好的,您可以在演示中看到
  • 您可以使用任何TTF字体将文本写入图像。字体指定为TTF文件,该文件无需安装在服务器上
  • 长长的图形命令列表:MagickWand:247个命令,DrawingWand:117个命令,PixelWand:51个命令
  • 该库运行稳定。我从未见过崩溃(例如,由于传递了损坏的图像文件)
  • 代码是开源的

但是MagickWand库有一个缺点
没有可用的文档。您在互联网上可能找到的是命令及其参数的定义。但没有详细的解释,并且很难找到示例代码。

这也是我发布这篇文章的原因之一。我的即用型软件包使您能够轻松开始使用MagickWand。

MagickWand - 演示项目

要将文本添加到此图像,您只需要4行PHP代码

演示项目包含一个PHP类“Magick”,您可以重用它来处理图像。
它包含以下功能

  • 加载任意大小的图像,包括带有透明背景的图像
  • 调整图像大小(创建缩略图)
  • 裁剪图像(请参见下面的ImageCutter项目)
  • 旋转图像
  • 模糊图像
  • 翻转/镜像图像
  • 将文本写入图像
  • 创建验证码图像
  • 将图像保存到磁盘
  • 直接将图像流式传输到浏览器
  • 定义JPG压缩质量
  • 从图像头获取信息(例如,宽度、高度、类型),而无需加载整个图像
  • 该类具有清晰的错误处理(无垃圾代码),并在出错时抛出异常

该类演示了MagickWandDrawingWandPixelWand与以下“magick”命令的用法
NewMagickWandNewDrawingWandNewPixelWandMagickPingImageMagickGetImageTypeMagickReadImageMagickNewImageMagickCompositeImageMagickGetExceptionStringPixelGetExceptionStringDrawGetExceptionStringMagickGetImageWidthMagickRotateImageMagickResizeImageMagickCropImageMagickFlipImageMagickFlopImageMagickBlurImageDrawSetFontDrawSetFontSizeDrawSetGravityPixelSetOpacityDrawSetFillColorMagickAnnotateImageMagickSetFormatMagickEchoImageBlobMagickSetImageCompressionMagickSetImageCompressionQualityMagickWriteImageDestroyMagickWandDestroyPixelWandDestroyDrawingWand

MagickWand - 添加更多功能

显然,我的类只涵盖了MagickWand库庞大功能中非常小的一部分。

如果您需要更多功能,请不要在这里提问,例如“如何绘制一个圆?”。
我从来没做过,因为我不需要它,所以我不知道!
相反,请自己尝试,并在获得结果后,向该类添加一个新函数,并将代码与演示一起发送给我!
如果您的代码有用、工作正常且编写清晰,我将在CodeProject上发布它。
我希望在您的帮助下,我的Magick类将变得越来越通用。

因此,如果Magick类中缺少您需要的功能,那是因为还没有添加它!

MagickWand - 创建验证码图像

互联网上充斥着糟糕的验证码图像

这些验证码很糟糕,因为字符和图像中的随机数据颜色不同。应用一个颜色滤镜来过滤掉所有非黑色的内容,并将剩余内容发送给OCR软件,该软件将100%正确地识别字符,这将非常容易。这些验证码很容易被破解!

这些验证码很糟糕,因为字符被裁剪了。在左边的图像中,第二个字符可能是“I”或“T”。最后一个字符可能是“U”或“0”。您必须猜测。

这是最糟糕的验证码:它无法辨认。您必须猜测。

这是一个好的例子,我用我的Magick类创建了一个验证码。

  1. 字符和背景线具有完全相同的颜色(无法进行颜色过滤)
  2. 字符和背景具有相同的线宽(无法进行过滤)
  3. 字符具有随机的大小、旋转和位置
  4. 字符完全可见且未被裁剪
  5. 背景具有与字符相似的圆角
  6. 这个验证码对人类来说很容易阅读,但对文本识别软件(OCR)来说却无法检测。

您可以尝试使用自己的背景图像和自己的字体(任何TTF)。每次生成新的验证码时,修改背景图像也是可能的。我建议使用一个大的背景图像并裁剪其中的一个随机部分。请注意,旋转速度很慢,所以我不建议旋转背景!

演示项目还演示了如何轻松地使用Ajax验证用户输入的验证码是否有效。

重要提示

您应该始终不区分大小写地检查验证码,因为字符的大小是随机的(随机大小),并且小写的“x”可能看起来与大写的“X”相同。

MagickWand - 版本混淆

MagickWand扩展可以编译为

  • Q8,这意味着图像的每个像素使用8位表示红色、8位表示绿色和8位表示蓝色=每像素24位(2^24种颜色=1600万种颜色)
  • Q16,这意味着每种颜色16位=每像素48位(2^48种颜色=281,474,976,710,656种颜色)我完全不知道谁需要这么多颜色,但我肯定知道人眼无法区分这么多颜色。

您没有理由使用Q16版本。Q8版本提供出色的图像质量,使用内存更少,并且比Q16快。在phpinfo()中,您可以看到安装的版本。

此外,MagickWand扩展可以编译为

  • 静态,这意味着所有必需的代码都编译成一个的独立DLL
  • 动态,这意味着PHP的MagickWand扩展是一个DLL,它需要额外的ImageMagick软件包(12 MB)安装在服务器上。小的动态PHP扩展DLL加载了二十几个额外的DLL。

MagicWand - 安装

Windows

在您可以在此处下载的ZIP文件中,您会找到一个Q8静态编译的php_magickwand.dll。将此DLL复制到您的PHP扩展文件夹(在PHP.ini中定义的extension_dir文件夹)服务器上无需安装任何其他东西!这个DLL是独立的!

找到这个DLL并不容易,因为您会注意到所有指向Windows二进制文件的链接都已失效。在MagickWand for PHP的主页上,您可以看到Windows不再支持(FTP服务器上的文件夹仍然存在,但它是空的)。我最终在Dirk的页面上找到了这个DLL。

Linux

在ZIP文件中,您还可以找到一个RPM包。必须在服务器上另外安装ImageMagick库。(PHP扩展是动态编译的)

MagickWand - 配置

将此行添加到您的PHP.ini

extension = php_magickwand.dll

项目 3:图像切割器

此项目允许用户上传任意大小和格式的图像(例如,他们数码相机拍摄的7兆像素照片)并在线裁剪。我写这个项目是因为我的服务器允许用户向其个人数据添加一张证件照。这张证件照的大小始终固定为120 x 150像素。由于大多数人无法使用Photoshop等程序来上传具有最终分辨率的图像,因此这个图像切割器允许他们非常轻松地在线裁剪上传图像的一部分。

特点

  1. 用户上传一张高分辨率的图像(演示中使用的是甘道夫和他的魔杖)
  2. 这张图像将被缩小到最大尺寸600像素,然后显示给用户。
  3. 用户可以根据需要旋转图像
  4. 然后,用户在缩小的图像上将一个绿色矩形定位在脸上,然后单击“Crop”按钮。
  5. 他会看到裁剪后的图像的预览。
  6. 单击最终的“Accept”按钮后,临时缩小图像将被删除,裁剪图像将被移动到其最终目的地。
  7. 您应该有一个任务作业,在晚上删除Temp文件夹中所有旧文件,因为如果用户从未接受最终图像,临时图像将保留在服务器磁盘上。
  8. 在执行所有这些步骤时,页面从未重新加载:代码使用Ajax和复杂的JavaScript。
  9. 该代码已在各种浏览器上进行了测试。

下载

图像切割器项目是单独下载的。您需要安装MagickWand扩展,此扩展不包含在此下载中。因此,您需要另外下载MagickWand项目。为了保持项目的简单性,上传图像的代码不包含在内。您显然会使用我的UploadProgress项目来完成此操作。演示项目使用4张固定的图像,您可以用来玩。

Wamp服务器问题

如果您有Wamp服务器,您将无法使用此处提供的DLL。
Wamp会显示一条非常愚蠢的错误消息,称扩展DLL的版本与服务器的PHP版本不兼容。
这是完全错误的,因为在不同的PHP版本之间可能只有很小的差异,这些差异通常绝不会影响扩展的功能。Wamp强制您在每次更新服务器到新版本时重新编译扩展。

有一个简单的解决方案:不要使用Wamp!使用Xampp,它工作得很好。

入门教程:在Windows (Xampp) 上运行示例

  1. 检查您的PC上没有程序在端口80上运行服务器。如果您安装了Skype,请确保在“工具 -> 选项 -> 连接”菜单下,选中“将端口80和443作为备选入口连接”复选框!!文件共享软件也可能占用端口80。
  2. 检查您的浏览器是否配置了HTTP代理服务器。如果配置了,请将其关闭!
  3. Xampp Server(包括Apache、mySql、PHP等)安装到C:\Program Files\Xampp
  4. 打开文件C:\Program Files\Xampp\apache\bin\php.ini,并根据“配置”章节中的说明进行更改。
  5. php_uploadprogress.dllphp_magickwand.dll复制到文件夹C:\Program Files\Xampp\php\ext\
  6. 之后,从开始菜单的Xampp Control Panel中启动Apache服务器。
  7. 将CodeProject的ZIP文件的全部内容复制到文件夹:C:\Program Files\Xampp\htdocs\UploadProgressC:\Program Files\Xampp\htdocs\MagickWand
  8. 如果操作正确,将存在此文件:C:\Program Files\Xampp\htdocs\UploadProgress\index.php
  9. 在浏览器中输入https://。在左侧的Xampp菜单中,选择phpinfo()
    现在您应该看到两个扩展“magickwand”和“uploadprogress”,每个都有自己的表。
  10. 在浏览器中,输入https:///UploadProgresshttps:///MagickWand,然后开始玩吧!
  11. 注意:在对PHP.ini进行任何更改后,必须重新启动Apache!

黑客安全的Web编程

如今,非常重要的话题是

  • 我如何编写代码才能抵御黑客攻击?
  • 我如何正确配置PHP服务器(Apache/IIS)?
  • 什么是僵尸网络,我的服务器如何被它们滥用?
  • 我应该安装哪些重要的防病毒扫描程序附加组件?
  • 我如何远程检查服务器是否存在漏洞?
  • 在哪里可以学习黑客技术以及如何防御它?

我在CodeProject上写了一篇关于服务器安全的非常详细的文章。
强烈推荐阅读这篇文章,无论您编写任何Web应用程序!
您还可以在那里下载PHP和ASP版本的SecurityCheck脚本

Web服务

您可能也对我在CodeProject上的关于PHP中Web服务服务器和客户端的文章感兴趣。

Elmü

© . All rights reserved.