leadscloud

Google SEO|外贸营销推广

提问
我循环用file_get_contents抓取一堆url,但总是会在不到第100个URL的时候停下,提示我:“Warning: file_get_contents(URL) [function.file-get-

contents]: failed to open stream: HTTP request failed! HTTP/1.0 500 Read timed out
in D:\website\extra.php on line 65”

我在程序的开始已经有set_time_limit(0);了啊,那上面的错误会是因为什么呢?

回答
set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。
从警告信息来看,是被抓取的网页出现了服务器500错误,可能是他的程序出现超时了。

如果想改变file_get_contents的超时时间,可以用resource $context的timeout参数:
$opts = array(
‘http’=>array(
‘method’=>”GET”,
‘timeout’=>60,
)
);

$context = stream_context_create($opts);

$html =file_get_contents(‘http://www.example.com‘, false, $context);
fpassthru($fp);

参考资料:http://cn.php.net/manual/en/context.http.php

这样readfile函数的超时时间就设置成了10秒,如果你够细心的话,还会发现数组中还有一些其他的配置,第一维中的http是指定使用的网络协议,二维中的method批的是http的请求方法get,post,head等,timeout就是超时时间了。我想很多人会使用php内置的file_get_contents函数来下载网页,因为这个函数使用起来够简单。很多人也都很简单的使用它,只要传递一个链接它就可以自动的发送get请求,并将网页内容下载下来。如果比较复杂的情况,比如使用POST请求,使用代理下载,定义User-Agent等等,这时很多人就会认为这个函数做不了这样的事情,就会选择其他方式,如curl,来实现。实际上,这些事情file_get_contents也可以做到,

就是通过它的第三个参数,设置http请求的context。

支持的设置和使用方式见官方说明:http://www.php.net/manual/en/context.http.php

附:目前我知道的支持context参数的php内置函数有file_get_contents,file_put_contents,readfile,file,fopen,copy(估计这一类的函数都支持吧,待确认)。

function Post($url, $post = null)
{
$context = array();

if (is_array($post))
{
ksort($post);

$context[‘http’] = array
(

‘timeout’=>60,
‘method’ => ‘POST’,
‘content’ => http_build_query($post, ‘’, ‘&’),
);
}

return file_get_contents($url, false, stream_context_create($context));
}

$data = array
(
‘name’ => ‘test’,
‘email’ => ‘test@gmail.com‘,
‘submit’ => ‘submit’,
);

echo Post(‘http://www.yifu.info‘, $data);

OK , 上面函数完美了,既解决了超时控制又解决了Post传值。再配合康盛的改良版RC4加密解密算法,做一个安全性很高的webservice就简单多了。

原文:http://blog.csdn.net/adparking/article/details/7231849

1
2
3
4
5
6
7
8
9
10
<?php
if($_GET['s']!=''){
$change = array('+',' ');
$kwds = strtolower( $_GET['s'] );
$kwds = trim($kwds);
$searchredirect = get_settings('home') . '/search/' . str_replace($change, '-' ,$kwds). '/';
header("HTTP/1.1 301 Moved Permanently");
header( "Location: $searchredirect" );
}
?>

今天的VPS非常卡,不小心输入个命令 /usr/local/mysql/bin/mysqld 然后卡的不动了,我重启了。结果mysql就启动不了了。

查看 tail -n 50 /usr/local/mysql/data/***.err 提示

Can't init tc log Aborting , Failed to open log,   File './mysql-bin.000023' not found

解决办法:

问题出在mysql-bin.0000023上。

mysql5运行一段时间,在mysql/data目录下出现一堆类似mysql-bin.000***的文件,从mysql-bin.000001开始一直排列下来,有的占用了大量硬盘空间,高达上百兆,我的高达20多G。 这些文件是MySQL的事务日志log-bin。删除也是没事的。logbin主要是用来做回滚和增量备份的。 还可以在my.ini里把log-bin注释掉,就不产生日志文件了。

vi /etc/my.cnf
配置中的log-bin注释掉,

1
#log-bin=mysql-bin 

果然问题解决

log-bin=mysql-bin配置与主从配置有关,并且它记录了所有数据库的操作,用于灾难恢复,所以注释掉它也是有一定风险的,需要定时备份数据库!

迁移时可以把原先的数据库导出为.sql格式,然后再用notepad++或其它工具替换里面的所有域名为自己的新域名比如,替换crusherknowledge.com为crushertech.net ,这样你再导入新的数据库,这样便完成的数据库的迁移工作。

创建数据库并为新数据库添加用户名

1
2
3
CREATE DATABASE 'newdbname';
CREATE USER 'username'@'localhost' IDENTIFIED BY 'passwd';
GRANT ALL PRIVILEGES ON 'newdbname'.* TO 'usrname'@'localhost' IDENTIFIED BY 'passwd';

如果你没有这样做,这些表中的内容你需要修改。可以先修改wp_options, wp_blogs, wp_site 这几个重要的。然后再把所有的wp_N_posts和wp_N_options表中的内容替换下。

主要修改的表为:
wp_N_posts (N为每个博客的ID,下同)
wp_N_options
wp_blogs
wp_site

网站迁移好之后需要重定向,这个比较重要。如果你的wpu是二级域名格式的。可以这样重定向到新域名:

下面的例子为 http://crusherknowledge.com 重定向到 http://crushertech.net

1
2
3
4
5
6
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.crusherknowledge.com\.com
RewriteCond %{HTTP_HOST} ^(.*)\.crusherknowledge\.com$ [NC]
RewriteRule ^(.*)$ http://%1.crushertech\.net/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^crusherknowledge.com$ [NC]
RewriteRule ^(.*)$ http://crushertech.net/$1 [L,R=301]

这样便和原先的网站一模一样,只是域名不同而已。

了解更多关于htaccess的重写规则请访问:
http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html

从google中删除你网页的索引:

https://sites.google.com/site/webmasterhelpforum/zh-cn/how-to-remove-and-block-content-from-search-result

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
<?php

/**
* fixHtmlTag
*
* HTML标签修复函数,此函数可以修复未正确闭合的 HTML 标签
*
* 由于不确定性因素太多,暂时提供两种模式“嵌套闭合模式”和
* “就近闭合模式”,应该够用了。
*
* 这两种模式是我为了解释清楚此函数的实现而创造的两个名词,
* 只需明白什么意思就行。
* 1,嵌套闭合模式,NEST,为默认的闭合方式。即 "<body><div>你好"
* 这样的 html 代码会被修改为 "<body><div>你好</div></body>"
* 2,就近闭合模式,CLOSE,这种模式会将形如 "<p>你好<p>为什么没有
* 闭合呢" 的代码修改为 "<p>你好</p><p>为什么没有闭合呢</p>"
*
* 在嵌套闭合模式(默认,无需特殊传参)下,可以传入需要就近闭合的
* 标签名,通过这种方式将类似 "<body><p>你好</p><p>我也好" 转换为
* "<body><p>你好</p><p>我也好</p></body>"的形式。
* 传参时索引需要按照如下方式写,不需要修改的设置可以省略
*
* $param = array(
* 'html' => '', //必填
* 'options' => array(
* 'tagArray' => array();
* 'type' => 'NEST',
* 'length' => null,
* 'lowerTag' => TRUE,
* 'XHtmlFix' => TRUE,
* )
* );
* fixHtmlTag($param);
*
* 上面索引对应的值含义如下
* string $html 需要修改的 html 代码
* array $tagArray 当为嵌套模式时,需要就近闭合的标签数组
* string $type 模式名,目前支持 NEST 和 CLOSE 两种模式,如果设置为 CLOSE,将会忽略参数 $tagArray 的设置,而全部就近闭合所有标签
* ini $length 如果希望截断一定长度,可以在此赋值,此长度指的是字符串长度
* bool $lowerTag 是否将代码中的标签全部转换为小写,默认为 TRUE
* bool $XHtmlFix 是否处理不符合 XHTML 规范的标签,即将 <br> 转换为 <br />
*
* @author IT不倒翁 <itbudaoweng@gmail.com>
* @version 0.2
* @link http://yungbo.com IT不倒翁
* @link http://enenba.com/?post=19 某某
* @param array $param 数组参数,需要赋予特定的索引
* @return string $result 经过处理后的 html 代码
* @since 2012-04-14
*/
function fixHtmlTag($param = array()) {
//参数的默认值
$html = '';
$tagArray = array();
$type = 'NEST';
$length = null;
$lowerTag = TRUE;
$XHtmlFix = TRUE;

//首先获取一维数组,即 $html 和 $options (如果提供了参数)
extract($param);

//如果存在 options,提取相关变量
if (isset($options)) {
extract($options);
}

$result = ''; //最终要返回的 html 代码
$tagStack = array(); //标签栈,用 array_push() 和 array_pop() 模拟实现
$contents = array(); //用来存放 html 标签
$len = 0; //字符串的初始长度

//设置闭合标记 $isClosed,默认为 TRUE, 如果需要就近闭合,成功匹配开始标签后其值为 false,成功闭合后为 true
$isClosed = true;

//将要处理的标签全部转为小写
$tagArray = array_map('strtolower', $tagArray);

//“合法”的单闭合标签
$singleTagArray = array(
'<meta',
'<link',
'<base',
'<br',
'<hr',
'<input',
'<img'
);

//校验匹配模式 $type,默认为 NEST 模式
$type = strtoupper($type);
if (!in_array($type, array('NEST', 'CLOSE'))) {
$type = 'NEST';
}

//以一对 < 和 > 为分隔符,将原 html 标签和标签内的字符串放到数组中
$contents = preg_split("/(<[^>]+?>)/si", $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

foreach ($contents as $tag) {
if ('' == trim($tag)) {
$result .= $tag;
continue;
}

//匹配标准的单闭合标签,如<br />
if (preg_match("/<(\w+)[^\/>]*?\/>/si", $tag)) {
$result .= $tag;
continue;
}

//匹配开始标签,如果是单标签则出栈
else if (preg_match("/<(\w+)[^\/>]*?>/si", $tag, $match)) {
//如果上一个标签没有闭合,并且上一个标签属于就近闭合类型
//则闭合之,上一个标签出栈

//如果标签未闭合
if (false === $isClosed) {
//就近闭合模式,直接就近闭合所有的标签
if ('CLOSE' == $type) {
$result .= '</' . end($tagStack) . '>';
array_pop($tagStack);
}
//默认的嵌套模式,就近闭合参数提供的标签
else {
if (in_array(end($tagStack), $tagArray)) {
$result .= '</' . end($tagStack) . '>';
array_pop($tagStack);
}
}
}

//如果参数 $lowerTag 为 TRUE 则将标签名转为小写
$matchLower = $lowerTag == TRUE ? strtolower($match[1]) : $match[1];

$tag = str_replace('<' . $match[1], '<' . $matchLower, $tag);
//开始新的标签组合
$result .= $tag;
array_push($tagStack, $matchLower);

//如果属于约定的的单标签,则闭合之并出栈
foreach ($singleTagArray as $singleTag) {
if (stripos($tag, $singleTag) !== false) {
if ($XHtmlFix == TRUE) {
$tag = str_replace('>', ' />', $tag);
}
array_pop($tagStack);
}
}

//就近闭合模式,状态变为未闭合
if ('CLOSE' == $type) {
$isClosed = false;
}
//默认的嵌套模式,如果标签位于提供的 $tagArray 里,状态改为未闭合
else {
if (in_array($matchLower, $tagArray)) {
$isClosed = false;
}
}
unset($matchLower);
}

//匹配闭合标签,如果合适则出栈
else if (preg_match("/<\/(\w+)[^\/>]*?>/si", $tag, $match)) {

//如果参数 $lowerTag 为 TRUE 则将标签名转为小写
$matchLower = $lowerTag == TRUE ? strtolower($match[1]) : $match[1];

if (end($tagStack) == $matchLower) {
$isClosed = true; //匹配完成,标签闭合
$tag = str_replace('</' . $match[1], '</' . $matchLower, $tag);
$result .= $tag;
array_pop($tagStack);
}
unset($matchLower);
}

//匹配注释,直接连接 $result
else if (preg_match("/<!--.*?-->/si", $tag)) {
$result .= $tag;
}

//将字符串放入 $result ,顺便做下截断操作
else {
if (is_null($length) || $len + mb_strlen($tag) < $length) {
$result .= $tag;
$len += mb_strlen($tag);
} else {
$str = mb_substr($tag, 0, $length - $len + 1);
$result .= $str;
break;
}
}
}

//如果还有将栈内的未闭合的标签连接到 $result
while (!empty($tagStack)) {
$result .= '</' . array_pop($tagStack) . '>';
}
return $result;
}

http://yungbo.com/php/php-fix-unmachted-html-tags-no-phptidy-extension.html

http://blog.csdn.net/iseagold/article/details/5484904

把下面文件保存为文本文件,然后把扩展名txt改为reg . 双击文件导入即可,如果装了360会提示你,允许就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\runas]
@="管理员取得所有权"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\*\shell\runas\command]
@="cmd.exe /c takeown /f \"%1\" &amp;&amp; icacls \"%1\" /grant administrators:F"
"IsolatedCommand"="cmd.exe /c takeown /f \"%1\" &amp;&amp; icacls \"%1\" /grant administrators:F"

[HKEY_CLASSES_ROOT\exefile\shell\runas2]
@="管理员取得所有权"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\exefile\shell\runas2\command]
@="cmd.exe /c takeown /f \"%1\" &amp;&amp; icacls \"%1\" /grant administrators:F"
"IsolatedCommand"="cmd.exe /c takeown /f \"%1\" &amp;&amp; icacls \"%1\" /grant administrators:F"

[HKEY_CLASSES_ROOT\Directory\shell\runas]
@="管理员取得所有权"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@="cmd.exe /c takeown /f \"%1\" /r /d y &amp;&amp; icacls \"%1\" /grant administrators:F /t"
"IsolatedCommand"="cmd.exe /c takeown /f \"%1\" /r /d y &amp;&amp; icacls \"%1\" /grant administrators:F /t"

/usr/local/php/bin/php -m

Failed loading /usr/local/php/lib/php/extensions/no-debug-zts-20090626/ZendGuardLoader.so:  /usr/local/php/lib/php/extensions/no-debug-zts-20090626/ZendGuardLoader.so: undefined symbol: compiler_globals

这个错误是因为ZendGuardLoader 必须是要在Thread Safety Disable 的情况下才能使用。别无它法,只有重新编绎。但上网找了很久,没有答案解决。因为重新编绎的方法没一个管用的,无法使Thread Safety 关闭。 此问题不解决 Zend Optimizer 也便安装不了。

这个问题一直没有解决。回答的都不对。

说是要apache 编绎时 --with-mpm=prefork ,不对!
说是php重新编绎使用 --disable-maintainer-zts--disable-roxen-zts--without-roxen--disable-zts , 不对!

这是国外一个人的提问,没有解决。
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/PHP_Installation/Q_26890298.html

等待解决。

Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。

安装方法:

1
2
3
4
5
6
7
8
wget http://pecl.php.net/get/APC-3.1.9.tgz
tar zxf APC-3.1.9.tgz
cd APC-3.1.9
/usr/local/php/bin/phpize
./configure --enable-apc --enable-apc-mmap --with-php-config=/usr/local/php/bin/php-config
export LD_LIBRARY_PATH
make
make install

配置php.ini

1
vi /usr/local/php/lib/php.ini

在末尾加上,根据PHP不同的版本,路径会有不同,请作修改。

1
2
3
4
5
6
7
8
9
10
[APC]
extension = "/usr/local/php/lib/php/extensions/no-debug-zts-20090626/apc.so"
apc.enabled = 1
apc.cache_by_default = on
apc.shm_segments = 1
apc.shm_size = 32M
apc.ttl = 600
apc.user_ttl = 600
apc.num_files_hint = 0
apc.write_lock = On

然后重启Apache

1
service httpd restart

修改 /wp-includes/cron.php

找到timeout = 0.01 , 把0.01改为5或更大值。默认是0.01秒,如果超进就出现了任务丢失现象。

通过Mysql, 进入phpmyadmin

1
update wp_posts set post_status = 'publish' where post_date < now();

通过插件

WP Missed Schedule

lftp支持tab自动补全

登陆方法

1
2
lftp username:password@ftpaddr:port(defalut:21)
lftp ftphost -u username

!
可执行本地端 shell 中的命令, 如 !ls /usr/local/bin/
由於 lftp 并没有 lls(显示本地端档案列表的指令), 故可用 !ls 来替代。

下载:

mget -C *.jpg (把所有pdf文件以允许断点续传的方式下载,m代表multi)
mirror aaa/ (把aaa目录整个下载下来,子目录也会自动复制)
pget -c -n 10 file.dat (以最多10个线程并允许断点续传的方式下载file.dat,可以通过设置pget:default-n的值而使用默认值)

mirror OPTS remote [local]
下载整个目录(楼上的 get 只能用来抓档案)
-c 续传
-e 这个要小心一些, 比较远端和本地端的档案, 假如远端没有的, 就将本地端的档案删除, 也就是将本地端和远端资料同步。
-R 上传整个目录
-n 只下载较新的档案
-r 不用递回到目录中
–parallel=n 同时下载 n 个档案(预设一次只下载一个)

上传:

put,mput,都是对文件的上传操作,和get,mget类似。
mirror -R local_dirname (把本地目录以迭代(包括子目录)方式上传到ftp site)

mv
将远端的 file1 改名为 file2

mrm
用 wildcard expansion 方式来删除远端档案


lftp登陆
lftp登陆常用格式:
lftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site]

[-d]
在debug mode运行。

[-e cmd]
执行指定的命令。

[-p port]
指定连接端口。

[-u user[,pass]]
登陆的用户名和密码。

[site]
FTP服务器地址。

例如:
lftp -p 21 -u admin,123456 ftp.aaa.com
表示使用用户名admin、密码123456登陆ftp.aaa.com这个站点,端口为21。

简便格式:
lftp user:password@site:port

例如:
lftp admin:123456@ftp.aaa.com:21
同样可以登陆。

随后就和其它命令行的ftp工具一样使用ftp内部命令进行控制。登陆后输入help可以查看支持的命令。

2、lftp的mirror命令
lftp登陆成功后,使用mirror命令用来备份文件。

将远程服务器上的文件备份到本地:
mirror [选项] [远程目录] [本地目录]

将本地文件备份到远程服务器上:
mirror -R [其它选项] [本地目录] [远程目录]

常用选项:
-c, –continue :如果镜像过程中连接中断,重新开始。
-e, –delete :删除不在远程服务器上的本地文件。
-n, –only-newer :下载远程服务器上的新文件,不能和-c一起用。
-R, –reverse :将本地文件镜像传输到远程服务器上。
-v, –verbose[=level] :设置监视级别,范围0-3,0表示不输出,3表示输出全部。

举例:
mirror -R –delete –only-newer –verbose /home/aaa.com /public_html/web/aaa.com

将本地/home/aaa.com目录下的文件备份到远程服务器/public_html/web/aaa.com目录。

mirror --delete --only-newer --verbose /public_html/web /tmp

将远程服务器上/public_html/web目录下的文件备份到本地/tmp目录下。

3、一条命令实现lftp登陆和mirror
使用lftp的-e选项,例如:

1
lftp -e "mirror -R --delete --only-newer --verbose /home/aaa.com /public_html/web/aaa.com" -p 21 -u admin,123456 ftp.aaa.com

登陆后自动执行-e选项中的命令。

注意:如果远程FTP服务器是Pure-FTPd [privsep] [TLS],执行命令会报错
WARNING: Certificate verification: Not trusted
WARNING: Certificate verification: The certificate’s owner does not match hostname ‘www.xxx.com
并且停留在[Making data connection…],连接不上。

需要编辑lftp的/etc/lftp.conf:

vim /etc/lftp.conf

在最后加入:

debug 3
set ftp:ssl-auth TLS-P
set ftp:use-feat no

再次尝试查看详情是否有报错。

PS:lftp默认使用PASV模式,如要使用PORT模式,登陆后执行set ftp:passive off,或者直接将其加入到/etc/lftp.conf中。

4、lftp多线程下载

lftp还可以做为一个多线程下载工具。

常用选项:
pget -n :设置使用线程数。
-c :断点续传。

举例:

1
lftp -c "pget -n 10 http://sourceforge.net/projects/kvm/files/qemu-kvm/1.2.0/qemu-kvm-1.2.0.tar.gz"

5、lftp使用问题
1)使用lftp的mirror命令备份时报550错
rm: Access failed: 550 dirname: Directory not empty

在lftp命令开头添加:
set ftp:list-options -a
是因为该文件夹下有隐藏文件,服务器默认不显示,所以删不掉。

2)设置lftp超时时间和重试次数
在lftp命令开头添加:

1
set net:timeout 10;set net:max-retries 2;set net:reconnect-interval-base 5;set net:reconnect-interval-multiplier 1;

使用示例:

lftp -e "set net:timeout 10;set net:max-retries 2;set net:reconnect-interval-base 5;set net:reconnect-interval-multiplier 1;set ftp:list-options -a;mirror -R --delete --only-newer --verbose /home/aaa.com /public_html/web/aaa.com" -p 21 -u admin,123456 ftp.demo.com
0%