WEB技术

WEB技术之后端技术

PHPer 2018-01-23 495次浏览 0条评论 0 0 0
这里主要记录一些后端技术。

这里主要记录一些后端技术。...

登录 | 立即注册

更新于:2018-02-07 18:06:38

php解析html类库simple_html_dom(详细介绍)

下载地址:https://github.com/samacs/simple_html_dom


解析器不仅仅只是帮助我们验证html文档;更能解析不符合W3C标准的html文档。它使用了类似jQuery的元素选择器,通过元素的id,class,tag等等来查找定位;同时还提供添加、删除、修改文档树的功能。当然,这样一款强大的html Dom解析器也不是尽善尽美;在使用的过程中需要十分小心内存消耗的情况。不过,不要担心;本文中,笔者在最后会为各位介绍如何避免消耗过多的内存。
开始使用
上传类文件以后,有三种方式调用这个类:
从字符串中加载html文档
从文件中加载html文档


代码如下:


<?php
// 新建一个Dom实例
$html = new simple_html_dom();

// 从url中加载
$html->load_file('http://www.jb51.net');

// 从字符串中加载
$html->load('<html><body>从字符串中加载html文档演示</body></html>');

//从文件中加载
$html->load_file('path/file/test.html');
?>

如何避免解析器消耗过多内存

在本文的开篇中,笔者就提到了Simple HTML DOM解析器消耗内存过多的问题。如果php脚本占用内存太多,会导致网站停止响应等一系列严重的问题。解决的方法也很简单,在解析器加载html文档并使用完成后,记得清理掉这个对象就可以了。当然,也不要把问题看得太严重了。如果只是加载了2、3个文档,清理或不清理是没有多大区别的。当你加载了5个10个甚至更多的文档的时候,用完一个就清理一下内存绝对是对自己负责啦^_^,代码如下:


<?php
$html->clear();
?>

如果从字符串加载html文档,需要先从网络上下载。建议使用cURL来抓取html文档并加载DOM中。

查找html元素

可以使用find函数来查找html文档中的元素。返回的结果是一个包含了对象的数组。我们使用HTML DOM解析类中的函数来访问这些对象,下面给出几个示例:


代码如下:


<?php

//查找html文档中的超链接元素
$a = $html->find('a');

//查找文档中第(N)个超链接,如果没有找到则返回空数组.
$a = $html->find('a', 0);

// 查找id为main的div元素
$main = $html->find('div[id=main]',0);

// 查找所有包含有id属性的div元素
$divs = $html->find('div[id]');

// 查找所有包含有id属性的元素
$divs = $html->find('[id]');
?>

还可以使用类似jQuery的选择器来查找定位元素:


代码如下:


<?php
// 查找id='#container'的元素
$ret = $html->find('#container');

// 找到所有class=foo的元素
$ret = $html->find('.foo');

// 查找多个html标签
$ret = $html->find('a, img');

// 还可以这样用
$ret = $html->find('a[title], img[title]');
?>

解析器支持对子元素的查找


...

php判断两张图片是否相同

原文链接:http://www.webyang.net/Html/web/article_327.html

随着上传图片的增多,有的时候需要判断是否是相同的图片,然后进行删除。那么如何实现这个过程呢?

方法一:

sha1_file() 或者 md5_file()方法。

  1. $file = "./img/1.jpg";
  2. $file2 = "./img/2.jpg";
  3. $gg = sha1_file($file);
  4. $aa = sha1_file($file2);
  5. if($aa == $gg) echo 'equation';


这两个方法只能判断两张完全相同的图片,包括文件的大小,尺寸,另外这个方法还可以用来判断文件。

方法二:

  1. $filename = '1.jpg';
  2. list($width, $height) = getimagesize($filename);
  3. $img = imagecreatefromjpeg($filename);
  4. $new_img = imagecreatetruecolor(8, 8);
  5. imagecopyresampled($new_img, $img, 0, 0, 0, 0, 8, 8, $width, $height);
  6. imagefilter($new_img, IMG_FILTER_GRAYSCALE);
  7. $colors = array();
  8. $sum = 0;
  9. for ($i = 0; $i < 8; $i++) {
  10. for ($j = 0; $j < 8; $j++) {
  11. $color = imagecolorat($new_img, $i, $j) & 0xff;
  12. $sum += $color;
  13. $colors[] = $color;
  14. }
  15. }
  16. $avg = $sum / 64;
  17. $hash = '';
  18. $curr = '';
  19. $count = 0;
  20. foreach ($colors as $color) {
  21. if ($color > $avg) {
  22. $curr .= '1';
  23. } else {
  24. $curr .= '0';
  25. }
  26. $count++;
  27. if (!($count % 4)) {
  28. $hash .= dechex(bindec($curr));
  29. $curr = '';
  30. }
  31. }
  32. print $hash . "\n";


...

Apache(四)访问验证方式-WEB技术之后端技术

Require all granted

允许所有请求访问资源

Require all denied

拒绝所有请求访问资源

Require env env-var [env-var] ...

当指定环境变量设置时允许访问

Require method http-method [http-method] ...

允许指定的http请求方法访问资源

Require expr expression

当expression返回true时允许访问资源

Require user userid [userid] ...

允许指定的用户id访问资源...

session多服务器共享的方案梳理 - WEB技术之后端技术

session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点。我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢?

php中session的原理,以前做了一下总结,可以参考:http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html

以前业界使用session的做法:

默认情况下,php的session文件是保存在磁盘文件中。在php.ini配置文件中的配置项如下:

session.save_handler = files

session.save_path = "N;/path"

第一个配置项是指定使用files(文件形式)存储session数据。

第二个参数指定保存的路径。N表示生成多少级目录(不放到一个目录下,分散到多个磁盘目录中去)

我的配置项是:session.save_path = "F:/wamp/tmp"。那么就会去这个目录下面看到很多session数据的文件。

当我们使用php的内置函数session_start()的时候,就是去上面指定的磁盘目录把session数据载入,实际上就是拿类似

sess_74dd7807n2mfml49a1i12hkc45的文件。

74dd7807n2mfml49a1i12hkc45就是大家经常说的什么session的id号。

php.ini中还有一个关键配置项,如下:

session.name = PHPSESSID

PHPSESSID就是cookie的名称,其实上面一串"74dd7807n2mfml49a1i12hkc45"会保存在一个名为PHPSESSID的cookie中。

根据http的请求机制,当浏览器请求的时候,头部信息会把浏览器中的cookie一起发给服务器。PHPSESSID这个cookie也

是在其中发给了服务器,php引擎通过读取PHPSESSID的值来确定要载入哪个session文件。

比如值为74dd7807n2mfml49a1i12hkc45,载入的就是"sess_74dd7807n2mfml49a1i12hkc45"。

注:当你调用php的函数session_start(),才表明你需要使用session文件了。不然平白无故就去载入文件,浪费性能。

===========================================

根据如上原理。session的数据默认是保存在磁盘文件中。假设这种情况:多台php服务器进行负载均衡的时候,比如有三台php服务器,为了实现负载均衡,那么三台服务器上面的php代码都是一样(拷贝一份)。

上面的图是nginx+fpm部署图。可以看到多台php服务器进行负载均衡。

生成session数据文件都是在本地了(a,b,c各自的服务器磁盘上)。负载均衡的目的本来就是要为了平均分配请求,所以没有固定第一次访问和第二次访问是同一台服务器,实际上无法确定的。第一秒访问可能是a服务器,第二秒访问的可能是c服务器。

所以同一个登录会员,实际上就会出现:第一秒访问第一台php服务器,第二秒访问的是第二台服务器。登录的信息一般是保存在session中的。这样子登录保存的session数据就需要进行共享了。不然的话会出现,访问第一台服务器生成了一个session数据。第二秒负载请求到第三台服务器,结果获取不到刚才生成的session数据。

我的理解是:只有涉及到多台多台后端服务器(php,java等处理服务器)的时候,才涉及到session读取不到的问题。

在php环境中,只有多台php服务器(php服务器而非web服务器,session文件是php引擎生成的)的情况下,才会涉及到

session共享的问题。单台php服务器,存储都在一台主机上。不涉及到共享问题。因为session直接存储在这台服务器磁盘上是能够被本机读取到的。

如果是:一台php服务器,多台mysql服务器。这种也是负载均衡,这种负载均衡不涉及到共享问题。因为怎么session数据怎么操作都是保存在一台服务器上。

==================================

ps:实际上,session在php,.net,java等只要是后端语言都会用到。session的存储机制,各种语言都大体差不多。我觉得这跟cookie在各个语言中都会用到差不多。.net,java我没去了解过。但是存储原理是差不多的。区别就是,php,java,.net调用的函数,读和取session数据的方式不同。默认都是存储在本地文件中的(不然怎么会涉及到session共享问题呢,存储在数据库本身就可以实现共享的)。

所以,无论是.net还是java都会涉及到session数据共享的问题。

其实我的理解是,session的原理都是一样的。讨论session共享方案设计,是可以抛开具体的语言去讨论session共享方案设计。

目前业界解决session共享的几种思路,我总结如下: ...

win7下Appserv或Xampp安装imagemagick以及php的imagick扩展教程并生成GIF缩略图(2018年版)

PHP项目中,需要用到切图和缩图的效果,在linux测试服务器上很轻松的就安装好php imagick扩展。但是在本地windows开发环境,安装过程遇到好多问题,在此与大家分享。这里的方法时候php5到php7

1. 下载 ImageMagick

优先下载地址:http://windows.php.net/downloads/pecl/deps/ 这里有低版本的

(注意这里下载的版本不能太高,不然运行不起来,这个版本是我测试正常的):


ImageMagick-6.9.3-7-vc14-x64.zip

备选下载地址:http://imagemagick.org/script/download.php#windows

下载最新版本 :ImageMagick-7.0.7-22-Q16-x64-dll.exe (注意这里的7.07是ImageMagick的版本,不是php对应的版本,)

(注:其实应该先安装php的imagick扩展再安装ImageMagick,根据imagick的版本安装对应版本的ImageMagick,我会在后面再细说。)

2. 安装 ImageMagick
安装 ImageMagick 到 PC 上。安装路径不能出现空格,否则无法使用(有空格发觉ImageMagick也能用)。安装时,一点选中把执行路径添加到 path 上,否则你就得手动去添加 path 路径了。

3. 测试安装

为了验证工作正常,在命令提示符窗口(win+r -> “cmd” -> Enter)输入以下:

magick logo: logo.gif
magick identify logo.gif
magick logo.gif win:

第一行命令会在当前目录下生成一个logo.gif图片

第二行命令会输出

D:\AppServ\www\test>magick identify logo.gif

logo.gif GIF 640x480 640x480+0+0 8-bit sRGB 256c 28576B 0.000u 0:00.000

第三行命令会打开这个gif文件,漂亮吧

f9ceb73a93-logo.gif

如果有任何其他问题,你可能需要 vcomp120.dll. 为了安装它, 下载 Visual C++ 2013 Redistributable Package.

4. 下载 php扩展 php_imagick.dll

首选下载地址:https://pecl.php.net/package/imagick

下载地址:https://pecl.php.net/package/imagick/3.4.3/windows

备用下载地址 http://www.peewit.fr/imagick/

dyn = dynamic, st = static, q16 = 16 bit, q8= 8 bit.

以上标识,同你下载的ImageMagick下载标识相同,本人用的是q16

5. 把dll文件重命名为php_imagick.dll,并放到php 扩展文件目录 php/ext 中。

6. 在 php.ini 配置文件中添加,extension=php_imagick.dll。

Appserv或XAMPP把CORE_RL_bzlib_.dll等除php_imagick.dll文件之外的文件放到对应的Appserv/Apache24/bin或xampp\apache\bin下,重启apache,如果没问题的话,就ok了。

如果你还没安装ImageMagick的话,安装了imagick扩展成功后显示是下面这样的

dedcf0724c-imagemagick02.jpg

如果已经安装了ImageMagick,正常的话显示应该是下面这样的。

7. 重启电脑,只重启apache不管用的情况下,重启下PC。因为扩展底层使用的是imageMagic软件,所以软件重启电脑,重新加载软件,并刷新path路径。

8. 重启后,打开 phpinfo页面,查看,扩展已经安装成功。如果还未安装成功,极有可能imagemagick软件版本过高,请选择更低一级的版本安装。

9. PHP测试代码,生成gif动态缩略图

<?php 
$image = new Imagick('old.gif'); 
$image = $image->coalesceImages(); 
foreach ($image as $frame) { 
$frame->thumbnailImage(47, 20); 
} 
$image = $image->optimizeImageLayers(); 
$image->writeImages('new.gif', true); 
?> 

10. 查看手册,学习API

相关扩展学习手册地址 http://uk3.php.net/manual/zh/book.imagick.php 手册中包含大量易用实例。

这里还有查看命令行参数的文档 http://www.imagemagick.org/Usage/



下面是网上找的另一个文章,这个讲的比较详细,但是不全面,对于Apache服务器用Appserv和Xampp集成的情况没讲到
...

php thread safe non thread safe到底选择哪个?- WEB技术之后端技术

如果你是在windows下使用IIS+PHP的话,你需要下载VC9的版本。

如果你是在windows下使用Apache+PHP的话,你需要下载VC6的版本。

Non Thread Safe是指非线程安全,Thread Safe则是指线程安全。

如果是使用ISAPI(注:Internet Server Application Programming Interface ,电脑为Microsoft所提供的Internet server的API)的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。这样一来,如何选择您适用的PHP版本就迎刃而解了,去下载适合您系统的PHP吧。...

关于Linux下用户权限问题-WEB技术之后端技术

自己建立了一个用户,用来管理web目录和composer的,结果运行yum install时提示

-bash-4.2$ yum install ImageMagick

Loaded plugins: fastestmirror

You need to be root to perform this command....

在安装imagick时到安装yum install -y php-pear 报错 - Linux yum安装

[root@izj6c76p~]# yum install -y php-pear

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

* remi-safe: mirrors.tuna.tsinghua.edu.cn

* webtatic: sp.repo.webtatic.com

Resolving Dependencies

--> Running transaction check

---> Package php-pear.noarch 1:1.9.4-21.el7 will be installed

--> Finished Dependency Resolution


Dependencies Resolved


=================================================================================

Package Arch Version Repository Size

=================================================================================

Installing:

php-pear noarch 1:1.9.4-21.el7 base 357 k


Transaction Summary

=================================================================================

Install 1 Package


Total size: 357 k

Installed size: 2.2 M

Downloading packages:

Running transaction check...

getimagesize 函数的使用-中文文件名问题-getimagesize 函数不是完全可靠的

在用getimagesize处理中文名图片时报错。

failed to open stream: No such file or directory in D:\AppServ\www\img.php on line 4


网上查也一下没找到是不是getimagesize不支持中文,我是在windows上执行代码的

网上查了下,可以这样,把文件名重命名,然后再用getimgesize函数

$filename='测试001.jpg';
$newFileName='ceshi001.jpg';
rename(iconv('UTF-8','GBK',$filename), iconv('UTF-8','GBK',$newFileName));
$filename=$newFileName;
$image=__DIR__.DIRECTORY_SEPARATOR.$filename;
$imageInfo=getimagesize($image);

OK了,下面是转载内容,文章名:getimagesize 函数不是完全可靠的

以下是转载https://segmentfault.com/a/1190000003911296


getimagesize 函数并不属于 GD 扩展的部分,标准安装的 PHP 都可以使用这个函数。可以先看看这个函数的文档描述:http://php.net/manual/zh/function.getimagesize.php

如果指定的文件如果不是有效的图像,会返回 false,返回数据中也有表示文档类型的字段。如果不用来获取文件的大小而是使用它来判断上传文件是否是图片文件,看起来似乎是个很不错的方案,当然这需要屏蔽掉可能产生的警告,比如代码这样写:

<?php
$filesize = @getimagesize('/path/to/image.png');
if ($filesize) {
    do_upload();
}
# 另外需要注意的是,你不可以像下面这样写:
# if ($filesize[2] == 0)
# 因为 $filesize[2] 可能是 1 到 16 之间的整数,但却绝对不对是0。

但是如果你仅仅是做了这样的验证,那么很不幸,你成功的在代码里种下了一个 webshell 的隐患。

要分析这个问题,我们先来看一下这个函数的原型:

static void php_getimagesize_from_stream(php_stream *stream, zval **info, INTERNAL_FUNCTION_PARAMETERS)
{
    ...
    itype = php_getimagetype(stream, NULL TSRMLS_CC);
    switch( itype) {
        ...
    }
    ...
}
static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) {
    ...
    php_getimagesize_from_stream(stream, info, INTERNAL_FUNCTION_PARAM_PASSTHRU);
    php_stream_close(stream);
}
PHP_FUNCTION(getimagesize)
{
    php_getimagesize_from_any(INTERNAL_FUNCTION_PARAM_PASSTHRU, FROM_PATH);
}

限于篇幅上面隐藏了一些细节,现在从上面的代码中我们知道两件事情就够了:

  1. 最终处理的函数是 php_getimagesize_from_stream
  2. 负责判断文件类型的函数是 php_getimagetype

接下来看一下 php_getimagetype 的实现:

PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC)
{
    ...
    if (!memcmp(filetype, php_sig_gif, 3)) {
        return IMAGE_FILETYPE_GIF;
    } else if (!memcmp(filetype, php_sig_jpg, 3)) {
        return IMAGE_FILETYPE_JPEG;
    } else if (!memcmp(filetype, php_sig_png, 3)) {
        ...
    }
}

去掉了一些细节,php_sig_gif php_sig_png 等是在文件头部定义的: ...

采集时报错cURL error 60: SSL certificate problem

https://github.com/FriendsOfPHP/Goutte

之前用下面代码采集时

namespace backend\controllers;

use Yii;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use Goutte\Client;
/**
* 
*/
class CrawlerController extends BackendController
{
	
	public function actionIndex(){
		
	$client = new Client();
	$crawler = $client->request('GET', 'https://movie.douban.com/subject_search?search_tex=
%E7%BE%8E%E5%A5%B3&cat=1002');
		$crawler->filter('li')->each(function ($node) {
    		echo '<pre>';
    		print_r($node)."<br>";
		});

	}

}

报错 cURL error 60: SSL certificate problem: unable to get local issuer certificat...

修改php文件上传的大小限制upload_max_filesize

Question

当php脚本上传的文件大小超过php.ini中post_max_size,upload_max_filesize的限制的时候页面不会给出提醒,文件也上传失败。
php.ini 配置对php上传文件大小的影响参数有:
配置项 可能值 功能描述
file_uploads ON 确定服务器上的PHP脚本是否可以接受HTTP文件上传
memory_limit 8M 设置脚本可以分配的最大内存量,防止失控的脚本独占服务器内存
upload_max_filesize 2M 限制PHP处理上传文件的最大值,此值必须不大于post_max_size值
post_max_size 8M 限制通过POST方法可以接受的信息最大量

而对应的$_FILES 中error对应得错误提示有:

  文件上传时产生的错误
0:表示没有发生任何错误,文件上传成功
1:表示上传文件的大小超出了再PHP配置文件中upload_max_filesize选项限制的值
2:表示上传文件大小超出了HTML表单中MAX_FILE_SIZE选项所指定的值
3:表示文件只被部分上传
4:表示没有上传任何文件
由此看出php只能对upload_max_filesize这个配置项的限制做出判断,而对post_max_size则没有相应的判断,这时的页面其实是一个崩溃的状态,页面不会给出任何提示。...

MySQL 查看表结构简单命令

一、简单描述表结构,字段类型

desc tabl_name;

显示表结构,字段类型,主键,是否为空等属性,但不显示外键。

例如:desc table_name

7ab418149b_normal.png

二、查询表中列的注释信息

select * from information_schema.columns
where table_schema = 'db' #表所在数据库
and table_name = 'tablename' ; #你要查的表

例如:

3a9e4d9fcc_normal.png

可以自动选择你需要信息

三、只查询列名和注释
select column_name, column_comment from information_schema.columns where table_schema ='db' and table_name = 'tablename' ;

例如:

1890ba144d_normal.png

四、#查看表的注释
select table_name,table_comment from information_schema.tables where table_schema = 'db' and table_name ='tablename'

例如:

cfb78a9913_normal.png


五、查看表生成的DDL

show create table table_name;

例如:

bb2f983692_normal.png

这个命令虽然显示起来不是太容易看, 这个不是问题可以用\G来结尾,使得结果容易阅读;该命令把创建表的DDL显示出来,于是表结构、类型,外键,备注全部显示出来了。...

获取php内置函数源码

php反射获取自定义类的源码

注意:此方法只能获取自定义的类的源码,一般用IDE开发,都有自动找代码功能,所以此法用处不大。

class test{  
        private $name;  
        function set($value){  
                $this->name = $value;  
        }  
        function get(){  
                return $this->name;    
        }  
}  
class reflectionUtil{  
        static function getClassSourse( ReflectionClass $class){  
                $path = $class->getFileName(); 
                if($path){
                    $lines = @file($path);  
                    $from = $class->getStartLine();  
                    $to = $class->getEndLine();  
                    $len = $to-$from+1;  
                    return implode(array_slice($lines, $from-1,$len));  
                }else{
                    return 'not get code';
                }
        }  
}  
print ReflectionUtil::getClassSourse( new ReflectionClass('test'));


...

DKMS介绍

DKMS,是Oikawa等人在1996年提出一种与LKM类似的动态核心模块技术,它以文件的形式存储并能在系统运行过程中动态地加载和卸载。


DKMS:主要作用就是当内核发生变化(版本号),内核之外的驱动可以动态重新生成新的模块。因为内核之外的模块是找/lib/modules/内核版本号的当内核升级后,内核版本号发生变化,目录也发生变化,而内核之外的驱动版本号没有发生变化,此时就用不了了。而DKMS就是为了解决这个问题而出现的
如:以hello-0.1为例,我们首先需要把代码copy到"/usr/src"下面,这样完整路径将是"/usr/src/hello-0.1"。DKMS要求我们的代码目录必须以"<module>-<module-version>"的格式命名。本例中,代码的版本是0.1。DKMS主要的命令可以参考上图所示,分别是add、build、install、uninstall和remove,另外,还可以执行"dkms status"查看目前DKMS系统维护的模块的状态。
dkms.conf

PACKAGE_NAME="hello"
PACKAGE_VERSION="0.1"
CLEAN="make clean"
MAKE[0]="make all KVERSION=$kernelver"
BUILT_MODULE_NAME[0]="hello"
DEST_MODULE_LOCATION[0]="/updates"
AUTOINSTALL="yes"

Centos7用默认的防火墙firewall安装PPTP搭建vpn服务器

现在国内的服务器商已经不提供此服务,安装上了也用不了。

1 准备一个CentOS7服务器

2 检查是否支持PPTP

modprobe ppp-compress-18 && echo ok #返回OK
zgrep MPPE /proc/config.gz #返回CONFIG_PPP_MPPE=y 或 =m
cat /dev/net/tun #返回cat: /dev/net/tun: File descriptor in bad state

以上三条命令满足一条即为支持PPTP

3 安装PPP

yum install -y ppp

4 安装PPTPD

4.1 添加EPEL源:

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

4.2 安装EPEL源:

rpm -ivh epel-release-latest-7.noarch.rpm

4.3 检查是否已添加到源列表中:

yum repolist

4.4 更新源列表:

yum -y update

4.5 安装PPTPD:

yum install -y pptpd

5 编辑/etc/pptpd.conf设置VPN内网IP段

最后IP设置改为:

localip 192.168.0.1
remoteip 192.168.0.214,192.168.0.245

6 编辑/etc/ppp/options.pptpd

6.1 更改DNS项:

ms-dns 8.8.8.8
ms-dns 8.8.4.4

6.2 修改日志记录:

#nologfd
logfile /var/log/pptpd.log

7 编辑/etc/ppp/chap-secrets设置VPN账号密码

用户名 pptpd 密码 *//每个字段之间用tab键隔开 *表示用任意IP连接VPN都可以

样例:登录账号为root 密码为123 这样写:

root        pptpd     123         *

8 修改内核参数支持内核转发 (Centos7.x)

/usr/lib/sysctl.d/50-default.conf 文件里加入

net.ipv4.ip_forward = 1

输入命令生效:sysctl -p

9 修改防火墙设置: ...

Linux服务器搭建

Linux服务器的各种服务的搭建。

FTP,VPN(注,现在国内的服务器商已经不提供此服务,安装上了也用不了。),等等。...

为什么网上Python爬虫教程这么多,但是做爬虫的这么少呢?爬虫发展又该是如何呢?

很多人学习Python进阶可能都写过几个爬虫,但是最终做爬虫的人却比较少呢?是因为真的像别人说的那样,爬虫真的没“技术含量”,还是爬虫随着反爬的不断提升,做爬虫的代价越来越高难以维持成本?还希望能谈一谈爬虫的发展该是怎样的?可能做到双赢吗?请指教
python教程
python研究者,有空会出一套系统的python教程

354 人赞同了该回答

网上教程多,是因为入门简单,容易获得成就感,容易忽悠小白

爬虫就是因为太有技术含量,所以会的人少,可能看起来做的人就少了

爬虫远比我们想的复杂

大多数人会的,只是造一颗螺丝钉,而整个爬虫系统,就好比造火箭

大多数人,只掌握了入门级的水品,也就是最多能造个螺丝钉,造不出火箭

为什么我说爬虫远比我们想的复杂呢?

爬虫绝不是表面的 用requests、urllib,发个http请求那么简单

就如同 楼上的几位回答者所说,如果只是发个http请求,根本用不着专门来学,随便找个火车头之类的工具,拖几下鼠标就搞定了

实际情况中,你要抓人家的数据, 会有很多门槛:

1.人家检测出你是爬虫,拉黑你IP (人家究竟是通过你的ua、行为特则 还是别的检测出你是爬虫的?你怎么规避?)

2.人家给你返回脏数据,你怎么辨认?

3.对方被你爬死,你怎么设计调度规则?

4.要求你一天爬完10000w数据,你一台机器带宽有限,你如何用分布式的方式来提高效率?

5.数据爬回来,要不要清洗?对方的脏数据会不会把原有的数据弄脏?

6.对方的部分数据没有更新,这些未更新的你也要重新下载吗?怎么识别?怎么优化你的规则?

7.数据太多,一个数据库放不下,要不要分库?

8.对方数据是JavaScript渲染,那你怎么抓?要不要上PhantomJS?

9.对方返回的数据是加密的,你怎么解密?

10.对方有验证码,你怎么破解?

11.对方有个APP,你怎么去得到人家的数据接口?

12.数据爬回来,你怎么展示?怎么可视化?怎么利用?怎么发挥价值? ...

SecureCRT 8.5.3破解,输入记事本中给的密钥即可,无需破解器或者破解补丁

https://blog.csdn.net/MrDmmm/article/details/89527261

ecureCRT 8.5.3破解,输入记事本中给的密钥即可,无需破解器或者破解补丁,本人正在用这个破解版本,安装省心,简单,不用关闭杀毒软件,防火墙。

直接点开下边的微云链接,直接下载整个文件夹即可。安装前请先看文件夹中的安装步奏记事本,只要步奏正确,应该就没有什么问题,如果有问题在评论区留言。(如果需要别的资源,请在评论区留言。)...

linux下解决bash: syntax error near unexpected token `(' 的错误

最近在开发过程中,我想删除服务器上的一个jar包,但是这个jar包的名字上带有括号。

一开始我是这样子删除的:

rm -f HIBIKI_API(1).jar

但是我却得到下面的一句话:

bash: syntax error near unexpected token `(' 

然后我谷歌了一下,发现linux5.0之后,是不能带有括号的,这个时候就需要转译了。转译的方法有下面两种:...

mysqldump: [Warning] Using a password on the command line interface can be i

今天使用/usr/local/server/mysql/bin/mysqldump -h127.0.0.1 -uroot -proot reading > ./reading.sql导出数据库的时候报了这个错,当然数据库也没有导出来。这个问题应该是在MySQL5.6+版本的时候就有出现,可能是为了确保数据库的安全性采用的保护机制。

第一种方法、 修改数据库配置文件有些在/etc/my.cnf,有些是在/etc/my.conf我们需要在[client]部分添加脚本:host=localhostuser=数据库用户password='数据库密码'123

第二种、 修改命令现在就可以用上面的命令进行导出了,虽然还是有错误提示,但是是不影响导出的。如果介意的话可以使用/usr/local/server/mysql/bin/mysqldump --defaults-extra-file=/etc/my.cnf -h127.0.0.1 -uroot -proot dbname > test.sql1其实就是在上面的命令中加入了–defaults-extra-file=/etc/my.cnf 。这样就可以了,而且没有错误提示。————————————————版权声明:本文为CSDN博主「吃井不忘挖水人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_41399976/article/details/......

mysqldump: [Warning] Using a password on the command line interface can be i

今天使用/usr/local/server/mysql/bin/mysqldump -h127.0.0.1 -uroot -proot reading > ./reading.sql导出数据库的时候报了这个错,当然数据库也没有导出来。

这个问题应该是在MySQL5.6+版本的时候就有出现,可能是为了确保数据库的安全性采用的保护机制。

第一种方法、 修改数据库配置文件

有些在/etc/my.cnf,有些是在/etc/my.conf

我们需要在[client]部分添加脚本:

host=localhost

user=数据库用户

password='数据库密码'

1

2

3

第二种、 修改命令

现在就可以用上面的命令进行导出了,虽然还是有错误提示,但是是不影响导出的。...

php框架相关

php常用的7大框架

阿里云免费申请SSL证书

2020年3月21号记录

首先登陆阿里云SSL证书,网址 https://www.aliyun.com/product/cas

点击购买证书,选择免费版,然后选择立即购买,费用0,勾选同意服务协议,点支付,再点确认支付。提示支付成功。请登录控制台,申请证书,签发成功后,可安装到网站/APP/邮箱等使用。

申请证书

根据情况选择验证方式,我这里选择的DNS验证,我用的别的地方解析,然后提交

09455c9f47-qq20200320234910_normal.png

DNS验证方式

a46afd11b7-qq20200320235145_normal.png

去域名解析网站,添加记录,按照证书申请提供的信息,填选记录类型,主机记录,记录值信息,确认保存

4e64fb4040-qq20200320235323.png
...

【采集代码】采集代码实例

这里记录一些采集代码的实例 20200328

另外之前python采集的代码放那里了,2014还是2013搞的记不清了,有空重新写下。
...

python安装以及采集

安装python

1. 在python的官网下载python对应版本:https://www.python.org/downloads/windows/

64位下载Windows x86-64 executable installer 版本

32位下载Windows x86 executable installer 版本

打开链接如下图,版本会一直更新,选择任意一个适合自己电脑的版本就好

下载后安装,安装时注意到这步时,选择自己的安装目录,另外Add python to environment variables(添加环境变量)

f7ab72eb76_normal.png

安装完成后

2.验证:运行cmd

进入到自己的安装目录下,运行语句:python -V

若显示出Python对应版本则表示安装成功

e1ba136440-qq-jie-tu20200328201725_normal.jpg

下面开始python采集

python采集用到的库:

requests:用来获取网页的内容,支持https,用户登录信息等,很强大

安装pthon库

用pip安装,在cmd里输入:

pip install requests

dcd3a3c8a9-qq-jie-tu20200328202528_normal.jpg ...

PHP的exec()函数无返回值排查方法(必看)--php调用python脚本实例

php exec()函数执行一个外部程序遇到的问题。 20200328

exec()执行外部命令失败,但没有任何错误信息。

gather.php和gather.py同目录下

gather.py的代码如下

# coding=utf-8 #设置页码编码,解决中文乱码
import re
import requests
#注意这里增加引入了sys库  20200404
import sys
#模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
url =  'https://wokan.chawen.org/post/' + sys.argv[1]
#requests获取网页
respose = requests.get(url, headers=headers)
content = respose.text #获取内容
#保存采集的内容到文件
filename =  'test.txt'
f = open(filename, 'w', encoding='utf-8') ##ffilename可以是原来的txt文件,也可以没有然后把写入的自动创建成txt文件
f.write(content)
f.close()

exec执行某命令在命令行下没有问题,但是在php中就出错。这个问题99.99%与权限有关,但是exec执行的命令不会返回错误。一个技巧就是使用管道命令,gather.php(和gather.py同目录下)的exec代码如下:

$result=exec("py gather.py",$array,$ret);
var_dump($array);
echo("ret is $ret");

可以改为

$result=exec("py gather.py 2&1",$array,$ret);
var_dump($array);
echo("ret is $ret");

使用2&1,命令就会输出shell执行时的错误到$output变量, 输出该变量即可分析。

php脚本输出结果为:array(1) { [0]= string(28) "Can't find a default Python." } ret is 103

$result=exec("d:/python/python.exe gather.py 2&1",$array,$ret);
var_dump($array);
echo("ret is $ret");

执行gahter.php文件,ok,成功。文件同目录下生成了test.txt文件,里面保存了采集的结果。 ...

修改phpmyadmin中的默认登陆超时时间

在WEB服务器(apache,nginx,iis)的文件根目录下找到phpMyAdmin / libraries / config.default.php 文件,打开修改

$cfg['LoginCookieValidity'] = 1440;

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

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

phpMyAdmin配置文件现在需要一个短语密码的解决方法

在登陆phpMyAdmin后发现最下面有如下信息提示:配置文件现在需要一个短语密码。

如下图:

首先,在 phpMyAdmin 文件中找到一个文件“config.sample.inc.php”,这是phpMyAdmin配置文件的样本文件,我们需要把该文件复制,然后重命名为“config.inc.php”,config.inc.php是phpMyAdmin的配置文件,上传服务器时必须上传该文件。

然后用编辑器打开 config.inc.php 搜索下面一行代码:

$cfg['blowfish_secret'] = '';

将后面单引号里面随便填入个字符串即可(注意,要至少32位的字符串)( 其实,’blowfish_secret’用一个任意字符串作为cookie的加密字符串,如果没有加密钥匙,就会出现提示“配置文件现在需要绝密的短语密码(blowfish_secret)”。 )...

centos7 安装phpmyadmin

php71w ,Mysql5.7 安装phpMyAdmin,用yum安装失败,下面介绍下载安装包并解压的方法

1.官网https://www.phpmyadmin.net/downloads/下载phpMyAdmin压缩包

wget -c https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.zip

2.解压缩到/var/www/html/

unzip phpMyAdmin-5.0.2-all-languages.zip -d /var/www/html

3.重命名

2

cd /var/www/html/

mvphpMyAdmin-5.0.2-all-languages.zip phpMyAdmin

这一步一般都可以正常通过localhost/phpMyAdmin访问了,但是有时候总会出现些其他问题。

4.进入到phpMyAdmin安装目录下复制phpmyadmin的简单配置文件config.sample.inc.php,作为默认配置文件config.inc.php

复制文件

cp config.sample.inc.php config.inc.php

编辑配置文件

vim config.inc.php

配置文件现在需要一个短语密码,找到

2

3

$cfg['blowfish_secret'] = ''; //这里随意添加几个字符太短会有错误提示。

$cfg['Servers'][$i]['auth_type'] = 'cookie'; //这里默认就好

$cfg['Servers'][$i]['host'] = 'localhost'; //这里可以改为自己的ip地址或者域名,不改也没关系

5.如果出现错误提示

变量$cfg['TempDir'] (./tmp/)无法访问。phpMyAdmin无法缓存模板文件,所以会运行缓慢。

在phpMyAdmin目录下新建tmp文件夹

2

mkdir tmp

chmod 777 tmp

6.可能会提示缺少一些扩展程序

安装php链接数据库的扩展程序包

yum install php-mysql

安装支持多字节字符串扩展的程序包

yum install php-mbstring -y

安装支持多加密扩展的程序包

yum install php-mcrypt –y

7.其他电脑访问需要开启80端口或关闭防火墙

开启80端口

2

firewall-cmd --zone=public --add-port=80/tcp --permanent

//--zone作用域,--add-port=80/tcp添加端口/协议,--permanent永久生效

重启防火墙

systemctl restart firewalld

或者干脆直接关闭防火墙

查看防火墙状态

systemctl status firewalld

停止防火墙

systemctl stop firewalld...

python脚本传递参数

import sys
print(sys.argv[0])
print(sys.argv[1]) #表示传入的第一个参数
temp = sys.argv[1] + 'TEST'
print(temp)

运行脚本 ...

php 的定界符

php 的定界符 eof

PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话,肯定要有大量的转义符来对字符串中的引号等特殊字符进行转义,以免出现语法错误。如果是一两处还可以容忍,但是要是一个完整的 html文本或者是一个200行的js我想是谁都会崩溃的。这就是PHP为什么要引入一个定界符的原因——至少一大部分原因是这样的。 ...

Redis 知识点整理

原文链接:https://yuanmomo.net/2019/07/02/redis-interview/#more

2019-07-022020-04-09

1. Redis 数据结构

  1. 主要的数据类型:
    • String(K-V): 单值,键值对,类似 Memcached, 比如配置,常量值,开关等等。
    • Hash: 一般是存储对象接口,key 是对象的标示,filed 是属性,value 是属性值。
    • Set: 集合,存放不重复的数据,求交集,统计不重复的量。
    • List: 链表,常用在消息队列,TimeLine.
    • SortedSet: 排名,需要根据 一个值来排序的场景,排行榜等。
  2. 扩展数据类型
    • Pub/Sub 简单的发布/订阅,当订阅的 key 的值有变化的时候,会通知到订阅的客户端,回调。
    • HyperLogLog: 基数统计(B 树,bitmap,概率算法(LC,LLC,HLL)),统计一个大的集合(可能出现重复数据)中不同元素的个数。比如网站的 UV,链接访问的 UV,以及做合并的功能,还有留存。
    • Geo 地址位置信息
  3. Redis Module : Redis 拓展模块
    • BloomFilter: 布隆过滤器,快速判断一个元素是否在集合中。
      1. 就是一个很长的二进制 bit 位的数组,全部初始化为 0.
      2. K 个 hash 函数,每个 hash 函数会生成一个 hash 值。这个 hash 值对应了二进制 数组的某个点,然后将这个点标记为 1.
      3. 查询一个数据存在不存在时,需要判断 这 K 个点的位置是否都未为 1.
      4. 布隆过滤器添加元素
        1. 将要添加的元素给k个哈希函数
        2. 得到对应于位数组上的k个位置
        3. 将这k个位置设为1
      5. 布隆过滤器查询元素
        1. 将要查询的元素给k个哈希函数
        2. 得到对应于位数组上的k个位置
        3. 如果k个位置有一个为0,则肯定不在集合中
        4. 如果k个位置全部为1,则可能在集合中
      6. 优点: 是占用空间小,效率高。
      7. 缺点: 有误判,不允许删除。如果需要删除,可以CBF,每一位是一个 counter,不再是0和1两种结果。
    • RedisSearch
    • Redis-ML,

2. Redis 分布式锁

  1. setnx抢锁,然后设置一个 过期时间。不能先 set 抢锁,再 expire,必须保证原子性。
    • spring-data-redis:2.1版本后,使用 setIfAbsent(K key, V value, long timeout, TimeUnit unit) 方法来实现。

3. Redis 查找指定格式的 key

  1. 如果使用 keys ,但是会卡住 redis,因为 redis 是单线程的。所以可以用 scan,但是会有重复,需要客户端做一次去重复。

4. Redis 做异步队列

  1. 一般用 list 作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,适当的 sleep 一定的时间再重试,如果不用 sleep。可以用 blpop 命令,如果没有消息,会一直阻塞到消息来为止。
  2. 通过 pub/sub 订阅者模式 来做一次生产,多次消费,可以实现 1:N 的消息队列。pub/sub 的缺点是,在消费者下线过后,生产的消息会丢失,如果需要保证不丢失,需要使用 MQ.
  3. redis 实现延时队列,用时间戳做 score,消息内容做 member, 然后通过 ZADD 添加消息,消费者用 zrangebyscore 指令获取 N 秒之前的数据轮询处理。不过不建议,太占用内容。队列还是建议使用 MQ, Kafka

5. key 的过期时间

  1. 如果有大量的 key 在同一个时间过期,防止 redis 暂时的卡顿,在时间上面加一个随机值,使得过期时间分散一些。

6. Redis 持久化

  1. http://oldblog.antirez.com/post/redis-persistence-demystified.html
  2. 持久化方式:
    1. RDB 指定间隔时间的某个时间点的快照。
    2. AOF 持久化操作日志。当 redis 重启的时候,需要根据 AOF 的 log 文件来重构数据。AOF 日志文件是redis 的自定义格式。当 AOF文件太大,redis 会重写该日志文件,减少命令数,但是结果一致。比如多次累加一个 key 100次。aof 就会有100条语句,BGREWRITEAOF会精简命令。
    3. 可以禁用 redis 的持久化,只要我们想让我们的数据只在 redis 运行时存在。
    4. 可以同时使用 AOF 和 RDB 来持久化 redis 中的数据。需要注意的是,此时,Redis 重启时,AOF 的日志文件会被用来重构 redis 中的数据,以此来保证数据的完整性。
  3. RDB 做全量持久化,AOF 做增量持久化。RDB 每次消耗的时间长,down 机时,会丢失两次持久化之间的数据。所以,需要配合 AOF 来使用。Redis 重启时,先用 RDB 持久化的文件重构内存,然后使用 AOF 回放最近的操作指令来实现完整恢复重启之前的状态。
  4. 对于突然断电的结果,取决于 AOF 刷新日志到磁盘的时间间隔 sync。建议是 1s 刷新一次。
  5. RDB 的原理,就是 fork & COW. fork 过后,子进程和父进程共享数据段,此时,可以看做没有占用额外的内存开销。当父进程的数据有修改时,才会复制一份到子进程保存。所以,只有在极限情况,所有的父进程数据有修改,及其的物理内存使用率才会是 50%。
  6. RDB 的优点是重启快,缺点是会丢失数据,备份一次的时间长。AOF 的优点是可以做到不丢失数据或者丢失很少的数据,但是重启很慢,因为需要重新根据日志来构建 redis 数据。所以往往是 RDB 和 AOF 搭配使用。

7. Pipline

  1. Pipline 的好处是可以将多次 IO 减少为 1次。前提是这些之类之间没有因果相关性

8. Redis 的同步机制

  1. Redis 可以使用主从同步,从从同步。
  2. 启动时,做第一次同步,主节点做一次 rdb,同时将后续修改操作放入 buffer,待 rdb 完成后。将 rdb 文件全量同步到 从节点,从节点接受完成后讲 rdb 镜像加载到内存。加载完成后,再通知主节点讲期间修改的 缓存 buffer 发送过来。
  3. 以上是第一次启动时候的同步,当机器都启动完成后,后面通过 AOF 做同步就是近乎实时。

9. Redis 集群

Redis-sentinal 是着眼于高可用性。在 master down 机时,能在 slave 中选举一个新的 master,继续提供服务。Redis-cluster 着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。...

    您需要登录后才可以评论。 登录 | 立即注册
    相关内容

    WEB技术

    什么是WEB技术?下面会分前端技术和后端技术分别探讨。20180203未完待续。

    WEB技术之前端技术

    WEB技术之后端技术

    WEB应用转手机APP,手机APP制作平台推荐

    WEB应用与手机APP

    Android相关

    2017 年 Web 开发工程师技术发展路线图

    富文本编辑器

    个人比较喜欢的是 Redactor,还有Simditor、wangEditor和 bootstrap-wysiwyg,这些富文本的UI都很好看,特别是Redactor和Simditor,不过Simditor扩展并不丰富。...

    富文本编辑器Redactor在Yii2中的应用

    推荐内容

    超省心游戏加速:Wireguard+udp加速(CentOS版)--(实测:超不省心),以后搜帖...

    Wireguard+udpspeeder+udp2raw游戏加速方案 ---------------------------------------错误报告及解决-----------...

    wireguard+udpspeeder+udp2raw多用户配置

    Wireguard+udpspeeder+udp2raw游戏加速方案改进版-实测有效

    基于CentOS7 Centos8平台搭建邮件服务器

    EwoMail​在Centos8上安装了,各种坑,各种报错。这个集成包太臃肿了。 20200416 EwoMail 已经弃用,国内的一家公司搞的坑爹产品。 20200418

    如何在RHEL8 / CentOS8上安装Webmin

    设置postfix作为邮件发送服务器

    查问我看笔记功能的实现过程-全文搜索待开启,试试yiisoft/yii2-sphinx

    查问我看笔记功能的实现的重点就是全文搜索,如果不用Yii自带的ActiveRecord的话,就要找扩展,先找了个yii-xunsearch,不行太差了,又找了yiisoft/yii2-elasticsearch,...

    yii2框架中使用sphinx使用搜索引擎 多条件选择搜索

    运行php composer.phar require --prefer-dist yiisoft/yii2-sphinx

    U盘安装U盘启动-U盘启动盘一键U盘装系统

    https://www.upandashi.com/ 先要做U盘启动盘,然后下载Win7镜像或Win7的Ghost文件,放到U盘里,然后插在电脑上做系统,注意主板要改成U盘优先启动。 ...

    MySQL数据库设计总结

    规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字...

    什么是B-Tree

    二叉查找树、平衡二叉树、红黑树、B-/B+树性能对比