php中Fatal error: Class ZipArchive not found的解决办法

 更新时间:2016年11月25日 17:39  点击:2251
php在使用ZipArchive类时出现Fatal error: Class ZipArchive not found错误提示,下面我们来介绍在linux 与windows中的解决办法。

出现这个错误说明是程序在调用'ZipArchive' 这个类的时候没有成功,原因是由于在安装php的时候没有增加php zip的支持(非zlib)。

在Windows下的解决办法是:

1、在php.ini文件中,将extension=php_zip.dll前面的分号“;”去除,然后同样在php.ini文件中,将 zlib.output_compression = Off 改为 zlib.output_compression = On ;

2、重启Apache服务器。

在Unix/Linux下的解决办法:

1、在Linux下没有php_zip.dll这个文件(有也不会起作用的),所以需要重新编译一下php的zip模块。具体安装方法如下:

 代码如下 复制代码

cd /usr/src
wget http://pecl.php.net/get/zip
tar -zxvf zip
cd zip-1.x.x
phpize
./configure
make
sudo make instal

其中, 在最后使用make install命令的时候,可能需要用到root的权限,所以建议使用sudo来运行。安装完之后,屏幕上会提示zip.so的位置。然后将其记录下来,如:/usr/local/lib/php/extensions/zip.so。

2、使用root权限修改php.ini(通常可能会在/usr/local/lib/文件夹下,不过视当初安装php而定,可以通过phpinfo()来查看):

增加

 代码如下 复制代码
extension = /usr/local/lib/php/extensions/zip.so

,然后同样在php.ini文件中,将

 代码如下 复制代码
zlib.output_compression = Off

改为

 代码如下 复制代码
zlib.output_compression = On ;

3、最后别忘了重启一下Apache:apachectl restart;

这个针对php的zip模块就安装完成了,能够在php中使用ZipArchive类了

php exec在linux中返回值不能为负数有需要的朋友可参考一下。

我们先来了解一下关于exec函数的使用方法

exec()
原型:

 代码如下 复制代码
string exec (string command [, string array [, int return_var]])

exec ()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二 个参数时,才可以用第三个参数,用来取得命令执行的状态码。
例子:

 代码如下 复制代码
exec("/bin/ls -l");
exec("/bin/ls -l", $res);
exec("/bin/ls -l", $res, $rc);

第三个参数, 怎么不能接收负数??
这里的&$return_var就是程序返回值,起初我的回答是可以为负数。
一般在C语言里我们会这样写

 代码如下 复制代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
    printf("^_^n");
    return -5;
}

这个-5就是返回值,但习惯上是写成0或者1的。
注意:很多人的C代码里把main函数写成 void main() 这样实际上是不对的,详细的就不说了。
把上面的代码编译后,到CMD下运行,然后就能看到输出结果了。接着,输入“echo %ERRORLEVEL%”,回车,就可以看到程序的返回值了。这个%ERRORLEVEL%就代表了程序的返回状态。在WIN下确实是可以为负数的

,php调用也是正常的。

 代码如下 复制代码
E:devphp535>php -r "exec('return.exe',$out,$a);var_dump($a);"

int(-2)
但是到了linux下,始终为正数,刚开始怀疑是权限问题,用了chmod +x后,排除了权限问题。

 代码如下 复制代码
exec("/home/wwwroot/test/rtest.out 2>&1",$out,$a);
var_dump($out,$a);
array(1) { [0]=> string(3) "^_^" } int(251)

看起来成了256+return val,可以看到实际上返回了负数,只不过被转换成正数了。
接着看了下standard/exec.c里的源代码,没发现啥端倪,干到很奇怪,突然想到自己忘了一步。忘了看程序返回给OS的值了.
可以使用echo $? 显示最后命令的推出状况。

 代码如下 复制代码
-bash-3.00$ vi main.c
-bash-3.00$ gcc -o ./mm main.c
-bash-3.00$ ll
total 48
drwxr-xr-x  3 www www 4096 May  4  2011 2011
drwxr-xr-x  6 www www 4096 Jun 23  2011 eoc
-rwxr-xr-x  1 www www 7131 Feb  1 12:47 hello
-rw-r--r--  1 www www    3 Feb  1 12:51 hello.c
-rw-r--r--  1 www www   99 Feb  1 12:50 main.c
-rwxr-xr-x  1 www www 4714 Feb  1 12:51 mm
drwxr-xr-x  3 www www 4096 Jun 24  2011 test
-bash-3.00$ ./mm
^_^
-bash-3.00$ echo $?
251
-bash-3.00$

这样就可以看看exec返换给OS的值是多少。
在linux下,这个返回值就是无符号类型,返回的是一个正数,所以传给php也是正数了,php实际上也是调用的exec所返回的值。

     OUT了,也许linux就是这么规定的,程序中泰返回值为1~255区间,而自己不清楚这个规则。不过还没有确定是否linux里就是这么规定的。虽然问题很蛋疼,意义不大,不过也可以在这里留给遇到类似问题的人参考。不过到这里也没深究的必要了。谁要是真想彻底搞清楚,可以看看shell这块

 

phpexcel文件是一款开源的php表格操作插件,只要用到excel数据导入导出的朋友大多数人都选择此款插件了,但在使用中也会有问题出现,下面来看问题分析研究。

PHPExcel是PHP中功能最强大的导入、导出、操作Microsoft Excel的开源项目。但是它体系复杂,有时会让人难以掌控。


PHPExcel导出Excel表的使用方法网上已经很多了,本文就不赘述。不过,在使用过程中,我却发现了一个莫名其妙的问题:那就是使用PHPExcel自动导出excel的文件有时候能够正常导出并打开,有时候生成的excel文件却无法打开,Excel2007提示“发现无法读取的内容”。

使用文本编辑器打开生成的Excel文件,发现一行提示“Fatal error: Call to a member function setValue() on a non-object in PHPExcel/Calculation/FormulaParser.php on line 431”。

经过仔细而又痛苦的检查发现,原来是因为在写入单元格的文本值中,有些值以等号开头,例如“====中国青年报...”,结果PHPExcel在写入这个单元格的时候,将其判定为公式,于是调用公式解析器去计算相应的值,但是又无法正确进行计算(因为本来就不是公式嘛),所以就导致生成的excel文件无法打开。

解决办法非常简单

就是在往excel单元格写入文本值之前,先过滤掉等号“=”,即可。

 

以下是两种错误的解决办法:

(1)Fatal error: Maximum execution time of 30 seconds exceeded解决错误方法
需要修改php.ini文件,如果是使用Ubuntu 9.04 Server的服务器,可以在/etc/php5/apache2/下找到php.ini文件,如果是Freebsd,可以在/usr/local/lib/下找到php.ini文件。使用sudo权限编辑下面的语句:

将如下语句:
max_execution_time = 30
修改为:
max_execution_time = 300
也就是将PHP脚本最长执行时间从30秒延长到300秒。

然后重启一下Apache服务器,如果是Ubuntu Server的服务器,可以使用如下命令:
sudo /etc/init.d/apache2 restart

(2)Fatal error: Allowed memory size of 16777216 bytes exhausted 的解决办法
一样地需要修改php.ini文件:

将如下语句:
memory_limit = 16M
修改为:
memory_limit = 512M

也就是将PHP脚本所能够申请的内存从16M扩大到512M。具体数字可以根据自己的需要确定。

一样需要重启Apache服务器。

需要注意的是:
(1)以上的修改可能存在一定风险,例如给服务器造成过大的负担。所以请再三确认是否有必要给PHPExcel或者是其他PHP程序开放更大的内存空间以及更长的执行时间。
(2)修改完php.ini之后,只有重启Apache之后,新的设置才会生效。
(3)php.ini中的设置,请根据自己服务器的情况量力而行。

php + mssql 让真让人痛苦。这些读 php 读 mssql 的 ntext 字段类型问题又来了:当 ntext 的内容过长时,居然读不完整。

在网上找了很久,都是说 php 读 ntext 出错的,但没发现我的页面出错,就郁闷了。后来才查到是说 php 默认最大只能读 4K 的内容,原来是我的内容超过了 4K。修改方法如

下:

1、把 php 升级到 php5 。

    还好,我的已经是 php5 了。

2、调整 php.ini 的参数,把 php 默认最大只能读 4K 改大一点。

    ; Valid range 0 - 2147483647.  Default = 4096.
    ;mssql.textlimit = 4096

    ; Valid range 0 - 2147483647.  Default = 4096.
    ;mssql.textsize = 20480

 

    把 mssql.textlimit  和 mssql.textsize 前面的“;“去了,再把默认值勤改大一点,比如 20480 (20K)

3、重启 web 服务器。


本以为激动人心的时刻会来临,运行 php 页面,效果还是跟以前一样,字段数据没有完全读出来。后来又找到资料说 php 对 ntext 的支持不是很友好,要转为 text。于是又用

Convert(text, content) 转了,无效果不说,还差一点把我的 iis 弄死。在网上找了很久都无解。就在我打算放弃时,一个尝试的概念让我把数据库连接方式改了一下。我把

odbc_connect 改为 mssql_connect 居然就成功了。

 

php 链接mssql问题 ntext不能读取


明明可以链接到数据库,却不能读取的数据。Google,百度一番之后终于知道了,原来是php读取mssql的 ntext字段反回值为空的,建议可以把ntext字段改成 text。

如果是表里面没有ntext字段,可以用以下代码:

 代码如下 复制代码

// Connect to MSSQL

$link = mssql_connect(‘KALLESPCSQLEXPRESS’, ‘sa’, ‘phpfi’);

if(!$link    !mssql_select_db(‘php’, $link))

{

die(‘Unable to connect or select database!’);

}

// Do a simple query, select the version of

// MSSQL and print it.

$version = mssql_query(‘SELECT @@VERSION’);

$row = mssql_fetch_array($version);

echo $row[0];

// Clean up

mssql_free_result($version);

?》

如果表里面有ntext军字段,且不好修改回text字段, 可以如下:

1.修改 php.ini

打开php.ini

找到:

;mssql.textlimit = 4096

改为

mssql.textlimit = 2147483647

找到:

;mssql.textsize = 4096

改为

mssql.textsize = 2147483647

2.可以使用修改字段,由于sql server中,ntext和nvarchar字段是用unicode编码存储内容的,因此php通过mssql扩展读取带ntext和nvarchar类型字段的时候会抱错。

如果 title 字段类型为 nvarchar,content 字段类型为 ntext ,那么下面的sql语句会报错:

错的:

select title,content from article

正确的:

 代码如下 复制代码
select convert(varchar(255),title) as title, convert(text,content) as content from article

{这个方法不太实用,如果ntext内容 太长 转换之后会丢失数据,也就说过长的文章被截断了,而且在sql2008中 把ntext改成 nvarchar(max) 也不行}

3.如果你是虚拟主机,可以使用adodb 组件来读取。如果你主机不支持,目前笔者也没办法了。

 代码如下 复制代码

include(“adodb/adodb.inc.php”); //包含adodb类库文件

$conn=NewADOConnection(‘odbc_mssql’); //连接SQL Server数据库

$conn-》Connect(“Driver={SQL Server};Server=localhost;Database=mydb;”,‘username’,‘password’);

{使用adodb有一点要注意,使用adodbPHP连MSSQL的前提是驱动问题,5.2.10之前,PHP自带的驱动只支持MSSQL 7.0,如果要支持MSSQL 2000,需要将MSSQL 2000的ntwdblib.dll(2000.80.2039.0)复制到System32或者PHP目录下
5.2.11才支持MSSQL 2000,如果需要支持MSSQL 2005和2008,需要安装微软提供的驱动

所以如果是虚拟主机基本没办法

}

?>

 

读取mssql的ntext字段反回空置


在测试的时候明明可以链接到数据库,但是怎么也读取不到数据。经过查找资料发现原来是php读取mssql的 ntext字段反回值为空的,建议可以把ntext字段改成 text。

如果是表里面没有ntext字段,可以用以下代码:

 代码如下 复制代码

// Connect to MSSQL
$link = mssql_connect('KALLESPCSQLEXPRESS', 'sa', 'phpfi');

if(!$link    !mssql_select_db('php', $link))
{
die('Unable to connect or select database!');
}

// Do a simple query, select the version of
// MSSQL and print it.
$version = mssql_query('SELECT @@VERSION');
$row = mssql_fetch_array($version);

echo $row[0];

// Clean up
mssql_free_result($version);
?>
 


如果表里面有ntext军字段,且不好修改回text字段, 可以如下:

1.修改 php.ini

打开php.ini

找到:

;mssql.textlimit = 4096 


改为

mssql.textlimit = 2147483647


找到:

;mssql.textsize = 4096 


改为

mssql.textsize = 2147483647


2.可以使用修改字段,由于sql server中,ntext和nvarchar字段是用unicode编码存储内容的,因此php通过mssql扩展读取带ntext和nvarchar类型字段的时候会抱错。

如果 title 字段类型为 nvarchar,content 字段类型为 ntext ,那么下面的sql语句会报错:

错的:

select title,content from article


正确的:

 代码如下 复制代码
select convert(varchar(255),title) as title, convert(text,content) as content from article

3.如果你是虚拟主机,可以使用adodb 组件来读取。如果你主机不支持,目前笔者也没办法了。

 代码如下 复制代码
include("adodb/adodb.inc.php"); //包含adodb类库文件
$conn=NewADOConnection('odbc_mssql'); //连接SQL Server数据库
$conn->Connect("Driver={SQL Server};Server=localhost;Database=mydb;",'username','password');
?>

 

ecshop分类树显示所有分类的解决方法 有需要的朋友可参考一下本文章。

解决方法如下:
比如在goods.php里,

 代码如下 复制代码
 $smarty->assign('categories',         get_categories_tree());  // 分类树

大概在128行。找下就有了


 代码如下 复制代码
$smarty->assign('categories', get_categories_tree($goods['cat_id']));

改为

 代码如下 复制代码
$smarty->assign('categories', get_categories_tree());

主要就是把goods['cat_id']或得的ID去掉就可以了!

之后清缓存再看下前台,是不是已经变化了呢

注:到这里只解决了一半,还要在category.php进行一样的操作,这样在分类页也显示所有分类了。

 

还有更简单的办法就是修改 get_categories_tree 函数,是水神提醒我的。修改如下:

 代码如下 复制代码
    if ($cat_id > 0)
    {
        $sql = 'SELECT parent_id FROM ' . $GLOBALS['ecs']->table('category') . " WHERE cat_id = '$cat_id'";
        $parent_id = $GLOBALS['db']->getOne($sql);
    }
    else
    {
        $parent_id = 0;
    }

找到这段判断语句,注释掉,再加上


    // 添加设置,读出所以分类
    $parent_id = 0;

[!--infotagslink--]

相关文章

  • 409错误是什么 http 409错误怎么解决

    409错误是什么?http 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • http 405错误是什么 http 405错误怎么解决

    http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
  • php中json_decode()和json_encode()用法与中文不显示解决办法

    本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25
  • phpexcel导出数据身份证后四位0000解决办法

    在php中我们如果要导入excel数据我们通常会使用phpexcel插件了,但是有朋友会发与使用phpexcel导出数据出现身份证后四位是0000情况了,下面我们就来看解决办法。 最...2016-11-25
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • 403错误是什么 403错误怎么解决

    403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
  • 412错误是什么 412错误怎么解决

    412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
  • Perl CPAN::Modulelist的解决办法

    今天用CPAN安装Term::ReadLine,报了个这样的错误 Going to read /root/.cpan/sources/modules/03modlist.data.gz Can't locate object method "data" via package "C...2016-11-25
  • 407错误是什么 407错误怎么解决

    407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
  • 406错误是什么 406错误怎么解决

    HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
  • 410错误是什么 http 410错误怎么解决

    410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
  • HTTP 400错误是什么 HTTP 400错误怎么解决

    每当遇到http错误代码为400,代表客户端发起的请求不符合服务器对请求的某些限制,或者请求本身存在一定的错误,那么HTTP 400错误怎么解决呢?请看下文介绍。 目前400错...2017-01-22
  • phpStudy访问速度慢和启动失败的解决办法

    下面给大家介绍phpstudy访问速度慢的解决办法。1、修改mysql数据库链接地址为ip地址127.0.0.1。2、使用最新版本,这个坑了我好久时间。下面一段内容是关于phpstudy启动失败的解决办法。php5.3、5.4和apache都是用vc9编...2015-11-24
  • PHP Curl出现403错误的解决办法

    自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31
  • PHP判断上传文件类型的解决办法

    分享给大家php判断上传文件类型的方法,大家一起学习学习。/** * 读取文件前几个字节 判断文件类型 * @return String */ function checkTitle($filename){ $file=fopen($filename, "rb"); $bin=fread($file, 2); /...2015-10-21
  • Jrebel启动失败解决方案详解

    这篇文章主要介绍了Jrebel启动失败解决方案详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-07
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21