Java堂  


用js检测是否安装指定插件的函数

Filed under: DynamicLanguage — Jet @ 12:27 下午
Tags:
原文出处: 用js检测是否安装指定插件的函数
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

最近需要实在使用Javascript来检测客户端是否安装Quicktime插件,但是网上都是一些用来检测是否安装Flash插件的例子,而且大多数都是针对于IE的,后来查阅了一些例子然后写了一个用来检测任何插件的通用函数,现在拿出来同大家分享。

  1. /*
  2. * 用来检测是否安装指定的插件
  3. * pluginsName 插件的名称
  4. * activexObjectName 控件名称,主要针对于IE
  5. * author: Jet Mah
  6. * website: http://www.javatang.com/archives/2006/09/13/442864.html 
  7. */ 
  8. function checkPlugins(pluginsName, activexObjectName) {
  9.     // 通常ActiveXObject的对象名称是两个插件名称的组合
  10.     if (activexObjectName == '') activexObjectName = pluginsName + "." + pluginsName;
  11.    
  12.     var np = navigator.plugins;
  13.     // 针对于FF等非IE
  14.     if (np && np.length) {
  15.         for(var i = 0; i < np.length; i ++) {
  16.             if(np[i].name.indexOf(pluginsName) != -1) return true;
  17.         }
  18.         return false;
  19.     }
  20.     // 针对于IE
  21.     else if (window.ActiveXObject) {
  22.         try {
  23.             var axobj =eval("new ActiveXObject(activexObjectName);");
  24.             // 将对象转化为布尔类型
  25.             return axobj ? true : false;
  26.         } catch (e) {
  27.             return false;
  28.         }
  29.     } else {
  30.         // 以上情况都排除则返回false
  31.         return false;
  32.     }
  33. }

最后说明一点的是,如何来查找插件的名称?我是通过Editplus中Html工具栏里面的“插入Object”命令来获取的,比如插入Flash对象之后这个命令会产生一段HTML代码,其中Object中的id属性里面,将名称的空格和最后的Object去除就是对象的名称了。比如Flash的id为“Shockwave Flash Object”,那它的插件名称为“Shockwave”;Quicktime的插件名称为“Quicktime”等等。

参考资料:
JavaScript 判断是否安装了 Flash 插件

Apache中显示PHP源代码的原因

Filed under: DynamicLanguage,Tools,Web&Server — Jet @ 10:53 上午
Tags: ,
原文出处: Apache中显示PHP源代码的原因
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

通常来说如果Apache显示PHP源代码的主要原因是因为没有正确配置好PHP加载模块,最多的错误就是加载的php5_module文件位置错误,通常这种错误会导致Apache无法正常启动;另外最容易犯的就是没有增加php的文件头类型:

  1. AddType application/x-httpd-php .php .php3

但是今天我确遇到一件非常奇怪的事情,上面说的两种情况都不存在但是依然显示php源代码。后来经过长时间的排查终于发现误将放置在 VirtualHost 标签内的

  1. php_flag engine off

放到了外面,这种情况下使得针对某个站点不执行php解析的配置被设置为了全局配置了,估计这种失误比较少见,故写出来共享。

phpMyAdmin初次安装拒绝登录的问题及解决方法

Filed under: Database,DynamicLanguage,Tools,Web&Server — Jet @ 10:45 下午
原文出处: phpMyAdmin初次安装拒绝登录的问题及解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天安装phpMyAdmin 2.10的时候修改认证方式为cookie之后进入程序首页登录的时候一直提示访问被拒绝,真的是奇怪了。后来从网上查了一下原来是需要清空一下浏览器缓存。

参考资料:hpMyAdmin 2.10.2 配置

PHP中出现“Unable to load dynamic library”问题的解决方法

Filed under: DynamicLanguage — Jet @ 3:15 上午
Tags: ,
原文出处: PHP中出现“Unable to load dynamic library”问题的解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天把一个客户的服务器上面的PHP4升级到PHP5,根据前几天写的从PHP4升级到PHP5的步骤进行升级之后,总是在错误的日志文件中出现如下提示:

startup: Unable to load dynamic library : PHP5\ext\php_mysql.dll

可是明明将extension_dir设置正确了还是提示无法找到dll文件。后来在CSDN上面找到一篇相关的文章,大体意思是php扩展目录中的模块需要依赖于一些基础的dll文件,如果系统没有找到这些基础的dll文件的话也会是扩展模块产生错误。解决的方法有两种,一种是拷贝这些dll文件到system32目录下面,另外一种方法就是将这些dll的目录设置到环境变量%PATH%中去。PHP5的话只要设置其安装目录就可以了。

但是问题是我按照上面的设置还是出现上面的提示,真的是很奇怪。后来我尝试将libmysql.dll文件拷贝到system32目录下面的时候出现是否覆盖文件的提示,这个时候我才恍然大悟,原来php4中的dll目录下面的文件都被拷贝到system32目录下面而没有被删除,所以php5误将这些文件当作基础文件了。于是使用如下的批处理命令将php4留在系统中的文件一一删除即解决了问题:

  1. @echo off
  2. echo remove php4
  3.  
  4. echo remove php.ini and php4ts.dll
  5. del %SystemRoot%\php.ini
  6. del %SystemRoot%\system32\php4ts.dll
  7.  
  8. echo remove dlls from system32...
  9. del %SystemRoot%\system32\expat.dll
  10. del %SystemRoot%\system32\FDFTK.DLL
  11. del %SystemRoot%\system32\fribidi.dll
  12. del %SystemRoot%\system32\gds32.dll
  13. del %SystemRoot%\system32\iconv.dll
  14. del %SystemRoot%\system32\libeay32.dll
  15. del %SystemRoot%\system32\libmhash.dll
  16. del %SystemRoot%\system32\libmysql.dll
  17. del %SystemRoot%\system32\mSQL.dll
  18. del %SystemRoot%\system32\ntwdblib.dll
  19. del %SystemRoot%\system32\sablot.dll
  20. del %SystemRoot%\system32\ssleay32.dll
  21. del %SystemRoot%\system32\Yaz.dll
  22.  
  23. echo done!

这样说的话php5对于查找这些基础dll文件的顺序应该跟查找php.ini文件的顺序(详细见从PHP4升级到PHP5文章中的常见问题3)相反,或者是无论如何首先查看system32目录下面是否含有这些dll文件,如果存在的话就不在查找了。

增加内容(2007.9.20):
今天将PHP5.2.3升级为5.2.4之后依然出现上述的问题(系统:win2k server),但是5.2.3版本使用的很好。后来根据参考资料所说的两种方法(一种是拷贝这些dll文件到system32目录下面,另外一种方法就是将这些dll的目录设置到环境变量%PATH%中去)中的后者将php5的安装目录添加到环境变量%PATH%中之后重新启动下就OK了。但是同样的版本我在本机(系统: winxp sp2)只要在Apache设置PHPIniDir为php5安装目录就可以了,并没有设置环境变量,不知道什么原因。

参考资料:
如何解决PHP startup: Unable to load dynamic library的错误

加速你的PHP程序

Filed under: DynamicLanguage — Jet @ 10:26 下午
原文出处: 加速你的PHP程序
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

以前一直在用MMCache来做PHP的缓存,到今天才知道原MMCache的作者已经就职于Zend公司,现在重新开发了一个名为eAccelerator的项目,可以说是MMCache的“最新升级版本”了,呵呵

下面说一下安装的过程:

1. 在官方下载最新的版本,因为官方提供的都是源文件,所以必须使用VC++进行编译。如果你没有安装VS也没关系,可以到SiteBuddy下载编译好的dll文件,一定要看好对应的PHP版本。

2. 将dll文件拷贝到php的ext目录下面。

3. 最后修改一下php.ini文件,增加对eAccelerator的配置:

  1. ; 增加对eAccelerator的引用
  2. extension=eAccelerator.dll
  3.  
  4. [Eaccelerator]
  5. eaccelerator.shm_size="0"
  6. ; 保存Cache的文件目录,需要手动创建
  7. eaccelerator.cache_dir = "c:\temp\eaccelerator"
  8. ; 是否启用
  9. eaccelerator.enable="1"
  10. ;是否优化
  11. eaccelerator.optimizer="1"
  12. eaccelerator.check_mtime="1"
  13. eaccelerator.debug="0"
  14. eaccelerator.filter=""
  15. eaccelerator.shm_max="0"
  16. eaccelerator.shm_ttl="0"
  17. eaccelerator.shm_prune_period="0"
  18. eaccelerator.shm_only="0"
  19. ; 是否压缩
  20. eaccelerator.compress="1"
  21. ; 压缩的级别
  22. eaccelerator.compress_level="9"

这样重启下Apache就可以了。至于Linux下的安装可以参见下面的参考资料。

参考资料:
eAccelerator安装

windows版本的php5.2.3的一个bug

Filed under: DynamicLanguage — Jet @ 10:47 下午
Tags: , ,
原文出处: windows版本的php5.2.3的一个bug
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

PHP5.2.3-win32这个版本有个非常严重的bug,那就是最大内存设置成1024M,但是PHP实际返回的只有2M,经常返回下面的错误:

PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 786432) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1310720) (tried to allocate 393216 bytes)

这是官方的bug报告,该bug只出现于windows版本,linux版本没有这个bug。看来只能等下一次升级的时候修复了。

Zend Framework极好的起步教程

Filed under: DynamicLanguage — Jet @ 10:53 下午
Tags: ,
原文出处: Zend Framework极好的起步教程
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

以前介绍PHP框架的时候曾经提到过Zend Framework,最后提到学习参考的一些资料。其中IBM developerworks 上面的系列文章虽然不错,但是基于0.4版本的,同现在最新的1.0版本有很大的出入,变化太多了。

今天偶然间在网上发现了两篇Rob Allen写的入门文章:Getting Started with the Zend FrameworkGetting Started with Zend_Auth。前者是Zend入门教程,后者是介绍Zend_Auth,文章是基于Zend 0.9x版本的而且写的非常的棒。

值得一提的是前面的教程被Jason Qi翻译成了简体中文,而且翻译的还是非常不错的。目前Jason负责翻译Zend Framework 官方文档中的Zend_Acl,Zend_Auth,Zend_Validate 三部分的工作。大家可以到他的博客上去下载

从PHP4升级到PHP5

Filed under: DynamicLanguage — Jet @ 9:33 上午
Tags: ,
原文出处: 从PHP4升级到PHP5
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

因为有些项目需要使用Zend Framework,需要将原来使用的PHP4升级到PHP5,下面对这次升级总结一下。

安装过程

我的安装环境是:windows 2000 server,Apache2,PHP5.2.3(php-5.2.3-Win32.zip)。
1) 解压缩zip包,将其中的php.ini-recommended改名为php.ini;对php.ini文件进行一些修改

  1. ; 打开这个项使得一些使用tag模板的程序如discuz、dedecms等正常运行
  2. short_open_tag = On
  3. ; 修改php扩展组件的路径
  4. extension_dir = "php安装目录\ext"
  5. ; 增加对mysql的支持,将下面这行文字前面的分号删除即可
  6. extension=php_mysql.dll
  7. ; 设置session保存的目录,这项默认是被注释掉的
  8. session.save_path = "C:/temp"

2) 在Apache中进行设置,打开httpd.conf,在文件中添加如下设置:

  1. # 加载php5的apache模块
  2. LoadModule php5_module "php5的安装目录\php5apache2.dll"
  3. # 增加头文件
  4. AddType application/x-httpd-php .php .php3
  5. # 设置php.ini所在的文件目录
  6. PHPIniDir "php安装目录"

然后重启apache就可以了。

最后说明一句:如果在Apache配置文件中没有通过PHPIniDir “php安装目录”设置了PHP5的根目录的话需要将PHP5的安装目录添加到%PATH%的环境变量中。

一些常见的问题

1) 运行网站提示不能连接mysql数据库
这是因为默认情况下php5不像php4那样至此MySQL的,所以需要手动将 extension=php_mysql.dll 打开使其支持MySQL。

2) 运行某些包含session操作的程序时出现下面的错误提示:

Warning: session_start() [function.session-start]: SAFE MODE Restriction in effect. The script whose uid is 2023 is not allowed to access /var/tmp/ owned by uid 0 in /configs/config.inc.php on line 9

Fatal error: session_start() [function.session-start]: Failed to initialize storage module: files (path: ) in /configs/config.inc.php on line 9

这是php5一个安全模式的bug,默认session的save_path是系统的临时目录,这样会要校验权限。在php.ini文件里,显式指定session的save_path(比如 c:/temp)然后重启web服务就解决了。

3) Apache 设置的时候 PHPIniDir 有什么作用?
与php4搜索php.ini是在%SystemRoot%下不同的是,PHP5按照以下顺序依次查找PHP.ini:

* PHPIniDir (Apache 2 module only)
* 注册表键值:HKEY_LOCAL_MACHINE—SOFTWARE—PHPIniFilePath
* 环境变量:%PHPRC%
* PHP5的目录 (for CLI), 或者web服务器目录(for SAPI modules)
* Windows目录(C:\windows or C:\winnt)

所以如果是Apache + PHP5的话可以使用 PHPIniDir 指定php5的配置文件php.ini的路径。

4) 安装 PHP5 之后打开 Discuz!或DedeCMS 的时候图片和论坛的信息都无法正常显示
解决的方法是打开php.ini,查找short_open_tag,将其设置为short_open_tag= on。对于Discuz!论坛如果还是显示有问题的话可以将forumdata/cache和forumdata/templates下面的文件删除然程序重新创建下缓存即可。

5) 使用网上发布的“汉字验证码”程序的时候只显示背景不显示文字或显示类似“Invalid font filename in xxx.php on line 57”的错误信息
与PHP4不同的是PHP5在安全模式下不能访问系统路径,而网上发布的验证码程序中的字体只有一个文件名而不包含路径,如果指定完整路径(比如:C:\Winodws\Fonts\simhei.ttf)的话则会提示没有访问的权限。估计这个应该是php默认配置权限所造成的,我目前解决的方法就是将字体文件从系统目录直接拷贝到程序目录下面。我估计应该通过设置一下php.ini文件可以实现之前php4的效果,但是目前我还没有找到设置的方法。

6) 文件无法上传?
上传文件的时候出现下面的提示:

File upload error – unable to create a temporary file in Unknown on line 0

这是因为默认的php.ini中没有设置上传的临时文件,默认为系统的临时文件地址。如果没有权限去读系统的临时文件目录的话就会产生上述错误。解决的方法就是去掉 upload_tmp_dir 前面的分号然后设置临时文件目录。

参考资料:
安装使用PHP5和MySQL5的一点心得
apache2和php5整合并支持mysql5
PHP 5.2.2 安全模式session_start权限问题的解决办法
Discuz!团队倾力整理–常见问题合集合

PHP常见问题及解答

Filed under: DynamicLanguage — Jet @ 5:55 上午
Tags:
原文出处: PHP常见问题及解答
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

最近正在做一个PHP的项目,不过PHP算是刚接触,可以说是边学边做了。期间整理了一些常见的问题及解答,相信对其他朋友也有一些用处。

1. PHP中@有什么作用?比如@mysql_query 与 mysql_query 有什么区别呢?
@是PHP提供的错误信息屏蔽的专用符号,所以@mysql_query 与 mysql_query 的区别就是前者运行过程中不显示出现的错误,而后者显示错误。

2. require和include的区别是什么?
二者都是包含一个文件,其中最大的区别在于require()无论如何都会包含文件,而 include() 可以有选择地包含。比如下面的例子:

  1. <?php
  2. if(FALSE){
  3. require('a.php');
  4. }
  5. if(FALSE){
  6. include('b.php');
  7. }
  8. ?>

虽然前面的条件不成立,但是a.php 一定会被包含,而 b.php 一定不会被包含。

3.PHP中的extract是什么作用?一般用于什么场合?
PHP手册中是这样解释的

int extract ( array var_array [, int extract_type [, string prefix]] )

本函数用来将变量从数组中导入到当前的符号表中。接受结合数组 var_array 作为参数并将键名当作变量名,值作为变量的值。对每个键/值对都会在当前的符号表中建立变量,并受到 extract_type 和 prefix 参数的影响。

主要应用如下:

  1. // addslashes -- 使用反斜线引用字符串
  2. // 处理POST表单,把客户端 <form method="post">表单中的变量名取出来。
  3. extract(addslashes($_POST)); </form><form method="post">// 处理GET表单,把客户端<form METHOD="GET"></form>表单中的变量名取出来。
  4. extract(addslashes($_GET));

参考资料:
php 中 @mysql_query 与 mysql_query 有什么区别
require和include基本的区别是什么?
php中include和require有什么区别
PHP中的extract是什么作用??

Java中的RoR – Groovy on Grails

Filed under: DynamicLanguage,JavaPlateform — Jet @ 11:22 上午
原文出处: Java中的RoR – Groovy on Grails
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

groovy_logo.png
记得“Java 之父”James Gosling去年在北京出席Java10周年庆典的时候就谈到未来语言的趋势是动态语言,而Groovy就是基于Java的动态语言。

grails_logo.jpg
Ruby on Rails的成功极大的推进了集成框架概念在各种语言中的发展,而Grails就是在这种情况下产生的。Grails基于我们非常熟悉的开源技术,例如Spring、Hibernate和SiteMesh。因此对于J2EE程序员来说上手非常的容易。

概括的来说,诸如Ruby、PHP和Python之类的脚本语言最近几年越来越流行,因此需要开发一个Java脚本备选语言和类似Rails的针对Java环境的框架。Groovy就是这个脚本语言,而Grails就是这个框架。

下面是一些值得参考的资料:
Groovy和Grails简介
Groovy on Grails(简单应用)
grails 简单应用小结
Groovy 学习笔记

« 上一页下一页 »