首页 > 编程技术 > php

php CURLOPT错误Warning: curl_setopt() [function.curl-setopt]:...

发布时间:2016-11-25 17:37

在我们使用php curl函数时提示Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set…错误,下面我就来介绍碰到此问题要如何来排除问题吧。

如果当你在php中运行 CURLOPT_FOLLOWLOCATION 然后得到php提示错误信息为:
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set…

错误中提到两个关键safe_mode和 open_basedir,如果你是虚拟主机的没有设置APPCHE的权限是不能通过修改服务器配置来解决问题的,一般来说,服务器配置safe_mode都为off,然后为了一些安全对用户有一些限制,通过设置open_basedir来限制虚拟主机用户的PHP执行文件夹,因此当你使用CURLOPT_FOLLOWLOCATION (php curl函数,深层抓取数据)的时候,一旦有301转向等就会出现文中提到的错误信息.

在查了相关资料后,很快找到了解决办法,http://www.php.net/manual/en/function.curl-setopt.php,这些方法都在php官方帮助里有.

具体做法是在curl语句用不使用curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true),在php函数中自定义一个函数,

 代码如下 复制代码

function curl_redir_exec($ch,$debug="")
{
static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++ >= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$debbbb = $data;
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302) {
$matches = array();
preg_match('/Location:(.*?)\n/', $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
//print_r($url);
if (!$url)
{
//couldn't process the url to redirect to
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
/*    if (!$url['scheme'])
$url['scheme'] = $last_url['scheme'];
if (!$url['host'])
$url['host'] = $last_url['host'];
if (!$url['path'])
$url['path'] = $last_url['path'];*/
$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
//    debug('Redirecting to', $new_url);
return curl_redir_exec($ch);
} else {
$curl_loops=0;
return $debbbb;
}
}

函数定义好后,curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true)这条语句替换为curl_redir_exec($ch)

这样以后,我想你的PHP文件应该不会提示错误了,关于这段代码,在提供PHP官方连接用可以找到.

PhpMyadmin默认是不允许空密码登录了,这样如果是在服务器上使用它肯定是非常合理的,但是如果我们只是本地环境测试那么有时会觉得麻烦了,那么要如何解决这个问题呢?下面一聚教程小编给各位整理了解决办法。

在Windows或者Linux下mysql安装后默认的密码为空,
又当我们又安装了mysql的管理工具
phpmyadmin后登陆时出现“空密码登陆被禁止(参见允许密码为空)”。不能登录成功

解决办法如下:

1、要是你想用空密码,则将phpmyadmin下的

config.inc.php(根目录)或者config.default.php(根目录)

再则:librariesconfig.default.php

友情提示:由于版本不一样可能涉及的文件不同,基本为这三个文件)

中的$cfg['Servers'][$i]['AllowNoPassword'] = false;
改为$cfg['Servers'][$i]['AllowNoPassword'] = true;

2.要是你想设置密码不为空则将

$cfg['blowfish_secret'] = '123456'; // use here a value of your choice 你要设置的密码

3.设置好了,我们再来设置phpmyadmin超时的时间设置了

找到 phpMyAdmin / libraries / config.default.php 文件,打开,修改

$cfg['LoginCookieValidity'] = 1440;

将1440修改成更大的值即可。

注意:$cfg['LoginCookieValidity']的值不能大于php.ini里的session.gc_maxlifetime 的值,否则phpmyadmin 里会出现“您的 PHP 配置参数 session.gc_maxlifetime (外链,英文) 短于您在 phpMyAdmin 中设置的 Cookies 有效期,因此您的登录会话有效期将会比您在 phpMyAdmin 中设置的时间要更短。”错误。

补充:修改php.ini,找到

session.gc_maxlifetime = 1440

将数值改大就行了,然后使之生效

在安装好ecshop软件之后我们打开首页时提示Only variables should be passed by reference in错误了,碰到这个问题是什么原因呢?下面我们就一起来看看解决办法吧。

Ecshop是个坑爹货,为什么tiandi会说它是个坑爹货呢,请看一下下面的官方的运行环境推荐:

服务器端运行环境推荐
·php版本5.0以上5.3以下的版本(推荐使用5.2系列版本)
·Mysql版本5.0及以上
·空间安装zend
·空间支持文件锁功能
·开启GD功能
·Mysql函数支持mbstring、iconv、fsockopen
看见了吧,PHP5.3以下的版本,还推荐使用5.2的,尼妹的,现在哪个虚拟机还敢用5.3以下的版本?还在用5.3以下的版本?看看tiandi用的2两个主机,衡天的和wopus的都是5.3.28,至于为什么不用5.3以下的版本,自己google”php内存泄露”。

Ecshop上个月刚更新了最新版本,写代码的思路依旧坚挺,仍旧使用5.2版本,好吧,为了做一些测试,需要在本机上进行调试,但本机上装了wp3.9,忘了从哪个版本开始wp只支持5.3以上的php,所以本机的PHP环境是5.4.13。起先,做了两个批处理来切换php5.2.1和php5.4.13,然后发觉一直用批处理切换也累啊,索性直接5.4.13上跑ecshop看看哪里有问题就改哪里吧,结果泥煤的首页直接来个错误。

Strict Standards: Only variables should be passed by reference in D:\tiandiyoyo\hengtian\ecshop\upload\includes\cls_template.php on line 424

不淡定了,打开cls_template.php,定位到424行,发现下面内容:

 代码如下 复制代码

$tag_sel = array_shift(explode(' ', $tag));

将其注释掉,分别拆开,添加两行

 代码如下 复制代码

$tag_tmp = (explode(' ', $tag));
$tag_sel = array_shift($tag_tmp);
//$tag_sel = array_shift(explode(' ', $tag));

原因在于PHP5.3版本开始,array_shift不支持函数返回,记得之前博客里好像还有个帖子专门说了php5.3版本的改变,刚搜索没找到,?濉D壳捌渌?趁婀δ芑姑淮蚩???荒芘龅轿侍庠傩薷拇?肓恕?/p> 在使用php程序时提示Warning: touch() [function.touch]: Utime failed: Permission denied in错误,下面一起来看看此问题的解决办法。

使用timthumb.php出现Warning: touch() [function.touch]: Utime failed: Permission denied in错误

我们先来看一下touch()函数例子

touch() 函数设置指定文件的访问和修改时间。

touch(filename,time,atime)

例子

 代码如下 复制代码

<?php
touch("test.jpg");
?>

应用例子时出现错误

用timthumb.php来做缩略图,本地测试很OK,但是放到vps上面就出现下面的错误错误提示:

Warning: touch() [function.touch]: Utime failed: Permission denied in /home/wordpress/wp-content/themes/zkeyword/library/timthumb.php on line 199
A TimThumb error has occured

The following error(s) occured:
Could note create the index.html file - to fix this create an empty file named index.html file in the cache directory.

从字面上理解,是创建缓存的cache文件没有权限,我就直接将cache的权限设为0777,但是还是不行,还是提示权限不足,进入cache目录后还有一个index.html文件,将其设为0777,问题就解决了。

下面来看一个总结比较好的php 完美解决无法上传大文件文章,希望此文章能帮助各位解决办法,空虚可以在apache中修改或nginx中修改方法,希望例子对各位会带来帮助。

1、打开php.ini(打开方式就不用说了,百度一大堆)

2、查找post_max_size

表单提交最大数值,此项不是限制上传单个文件的大小,而是针对整个表单的提交数据进行限制的
默认为8M,设置为自己需要的值,此参数建议要设置比upload_max_filesize大一些

3、查找File Uploads

是否允许通过http上传文件的开关,确认file_uploads = on

4、查找upload_tmp_dir

文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
如果系统报错提示有“XXX临时目录XXX”的话,这个目录就需要你来设置一个有效目录,没报错就不用管

5、查找upload_max_filesize

允许上传文件大小的最大值,默认为2M,设置为自己需要的值此参数建议不要超过post_max_size值,因为它受控于post_max_size值(就算upload_max_filesize设置了1G,而post_max_size只设置了2M时,大于2M的文件照样传不上去,因为它受控于post_max_size值)

6、如果要上传大于8M的文件,还需要对下面的参数也进行设置:

查找max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 8M ;每个PHP页面所需要的最大内存,默认8M

如果你是Nginx的话还需要修改nginx.conf中的http段:

client_max_body_size 1024m; #我这里是1024MB

标签:[!--infotagslink--]

您可能感兴趣的文章: