木叶三忍的博客

web开发

Menu Close

Page 2 of 7

Linux下源码安装elasticsearch-5.5.2

环境准备

由于elasticsearch由Java实现,所以需要Java环境,在之前博文中,我已经介绍了Java的安装,博文链接

创建用户和密码

elasticsticsearch不能用root用户去启动,否则会报错,所以在这里我将会单独创建一个名为elasticsearch的用户,去运行elasticsearch程序,当前用户是root,所以无需切换,直接运行如下命令:

[root@lnmp ~]# useradd elasticsearch
# 创建密码,这里会有两次密码输入提示,确保一致即可创建完成!
[root@lnmp ~]# passwd elasticsearch

下载和安装elasticsearch

[root@lnmp ~]# cd /var/soft
[root@lnmp soft]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.tar.gz
[root@lnmp soft]# sha1sum elasticsearch-5.5.2.tar.gz 
[root@lnmp soft]# tar xf elasticsearch-5.5.2.tar.gz

创建程序目录,并修改相应权限

[root@lnmp soft]# mkdir /usr/local/elasticsearch-5.5.2
[root@lnmp soft]# mv elasticsearch-5.5.2/* /usr/local/elasticsearch-5.5.2
# 修改属主为elasticsearch
[root@lnmp soft]# chown -R elasticsearch /usr/local/elasticsearch-5.5.2
[root@lnmp soft]# cd /usr/local/elasticsearch-5.5.2
[root@lnmp elasticsearch-5.5.2]# ls -l
total 244
drwxr-xr-x  2 elasticsearch root            4096 Sep 11 09:33 bin
drwxr-xr-x  3 elasticsearch root            4096 Sep 11 10:22 config
drwxrwxr-x  3 elasticsearch elasticsearch   4096 Sep 11 10:22 data
drwxr-xr-x  2 elasticsearch root            4096 Aug 14 20:35 lib
-rw-r--r--  1 elasticsearch root           11358 Aug 14 20:30 LICENSE.txt
drwxr-xr-x  2 elasticsearch root            4096 Sep 11 10:06 logs
drwxr-xr-x 13 elasticsearch root            4096 Aug 14 20:35 modules
-rw-r--r--  1 elasticsearch root          194187 Aug 14 20:35 NOTICE.txt
drwxr-xr-x  2 elasticsearch root            4096 Aug 14 20:35 plugins
-rw-r--r--  1 elasticsearch root            9549 Aug 14 20:30 README.textile  README.textile

elasticsearch内存配置

elasticsearch5.5版本默认是需要分配2G内存,否则启动时会报错,类似如下:

INFO: os::commit_memory(0x00000000ea660000, 362414080, 0) failed; error='Cannot allocate memory' (errno=12)

如果你的内存不够,打开并编辑/usr/local/elasticsearch-5.5.2/config/jvm.options文件,将文件开始位置的配置修改,则可以解决,例如我将2G的默认配置修改称为512M,只需要删除或者使用#注释掉原来配置再添加自己的配置项即可,类似如下:

# 注释掉的原来的2G配置
#-Xms2g
#-Xmx2g

# 修改称为512M内存大小
-Xms512m
-Xmx512m

登录elasticsearch用户,并将程序目录加入环境变量

[elasticsearch@lnmp ~]$ who -m
elasticsearch pts/2        2017-09-11 14:07

确保当前用户为elasticsearch后,编辑~/.bash_profile文件,在export $PATH之前加入如下行,保存退出即可:

export PATH=/usr/local/elasticsearch-5.5.2/bin:$PATH

使新增的环境变量生效

[elasticsearch@lnmp ~]$ source ~/.bash_profile

运行elasticsearch

[elasticsearch@lnmp ~]$ elasticsearch

# 省略.....
[2017-09-11T11:27:04,584][INFO ][o.e.n.Node               ] initialized
[2017-09-11T11:27:04,585][INFO ][o.e.n.Node               ] [Q6tSN9S] starting ...
[2017-09-11T11:27:04,769][INFO ][o.e.t.TransportService   ] [Q6tSN9S] publish_address {127.0.0.1:9300}, bound_addresses {127.0.0.1:9300}
[2017-09-11T11:27:04,826][WARN ][o.e.b.BootstrapChecks    ] [Q6tSN9S] max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
[2017-09-11T11:27:04,827][WARN ][o.e.b.BootstrapChecks    ] [Q6tSN9S] max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]
[2017-09-11T11:27:04,827][WARN ][o.e.b.BootstrapChecks    ] [Q6tSN9S] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2017-09-11T11:27:04,827][WARN ][o.e.b.BootstrapChecks    ] [Q6tSN9S] system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
[2017-09-11T11:27:07,913][INFO ][o.e.c.s.ClusterService   ] [Q6tSN9S] new_master {Q6tSN9S}{Q6tSN9SYTnGsceAPmXQZZA}{iy1q-lT-SCSSp-gxeRflMQ}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-elected-as-master ([0] nodes joined)
[2017-09-11T11:27:07,952][INFO ][o.e.h.n.Netty4HttpServerTransport] [Q6tSN9S] publish_address {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200}
[2017-09-11T11:27:07,953][INFO ][o.e.n.Node               ] [Q6tSN9S] started
[2017-09-11T11:27:07,966][INFO ][o.e.g.GatewayService     ] [Q6tSN9S] recovered [0] indices into cluster_state

看到如上信息,并且命令行光标位于行首并不停闪动,表示启动成功!这里暂时不介绍后台运行。

测试elasticsearch

新开一个登录窗口,任何用户登录都行,这里需要使用到curl,如果没有,以centos为例自行yum安装即可,确保没问题后,最终执行如下命令:

[root@lnmp ~]# curl http://localhost:9200
{
  "name" : "Q6tSN9S",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "hV33j18ZSnaz9KvnLF5C7w",
  "version" : {
    "number" : "5.5.2",
    "build_hash" : "b2f0c09",
    "build_date" : "2017-08-14T12:33:14.154Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

参考于官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/zip-targz.html

Linux下源码安装Mongodb-3.4.7

一、下载并安装

[root@lnmp ~]# cd /var/soft
[root@lnmp soft]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.7.tgz
[root@lnmp soft]# tar xf mongodb-linux-x86_64-3.4.7.tgz
# 移动并重命名
[root@lnmp soft]# mv mongodb-linux-x86_64-3.4.7 /usr/local/mongodb-3.4.7
[root@lnmp soft]# cd /usr/local/mongodb-3.4.7
[root@lnmp mongodb-3.4.7]# ls
bin  GNU-AGPL-3.0  MPL-2  README  THIRD-PARTY-NOTICES

二、设置环境变量

编辑家目录下的.bash_profile文件,在export $PATH之前添加如下一行:

export PATH=$PATH:/usr/local/mongodb-3.4.7/bin

三、使其立刻生效

[root@lnmp mongodb-3.4.7]# source ~/.bash_profile

四、创建mongodb的数据目录

默认mongodb的数据目录存放于/data/db下,如果你想使用默认,请确保该目录存在,并且可写入。或者可以指定自定义的数据存储目录,例如:

mongod --dbpath 你的目录名称(绝对路径)

本文参考于Mongodb官方手册: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux

CentOS下安装Java8为Elasticsearch提供环境

一、下载Oracle JDK 8

1. 访问Oracle JDK download page,查看rpm版本的相关信息

2. 先勾选同意许可,然后右键复制下载链接jdk-8u144-linux-i586.rpm,因为我的centos是32位的,所以我选的x86版本。

3. 登录linux,并执行如下操作:

[root@lnmp soft]# pwd
/var/soft
[root@lnmp soft]# wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-i586.rpm

二、安装Oracle JDK 8

1. 我们使用yum localinstall去安装,执行命令:

[root@lnmp soft]# yum localinstall jdk-8u144-linux-i586.rpm

// 省略...
Installed:
jdk1.8.0_144.i586 2000:1.8.0_144-fcs

Complete!

2. 现在我们的JDK应该被安装在/usr/java目录下,我们查看相关文件:

[root@lnmp soft]# ls -al /usr/java
total 12
drwxr-xr-x 3 root root 4096 Sep 5 15:41 .
drwxr-xr-x. 14 root root 4096 Jul 22 05:45 ..
lrwxrwxrwx 1 root root 16 Sep 5 15:41 default -> /usr/java/latest
drwxr-xr-x 9 root root 4096 Sep 5 15:41 jdk1.8.0_144
lrwxrwxrwx 1 root root 22 Sep 5 15:41 latest -> /usr/java/jdk1.8.0_144

3. 更进一步看看:

[root@lnmp soft]# ls -al /usr/java/jdk1.8.0_144
total 25908
drwxr-xr-x 9 root root 4096 Sep 5 15:41 .
drwxr-xr-x 3 root root 4096 Sep 5 15:41 ..
drwxr-xr-x 2 root root 4096 Sep 5 15:41 bin
-rw-r--r-- 1 root root 3244 Jul 22 05:39 COPYRIGHT
drwxr-xr-x 4 root root 4096 Sep 5 15:41 db
drwxr-xr-x 3 root root 4096 Sep 5 15:41 include
drwxr-xr-x 4 root root 4096 Sep 5 15:41 .java
-rwxr-xr-x 1 root root 5097973 Jun 26 16:41 javafx-src.zip
drwxr-xr-x 5 root root 4096 Sep 5 15:41 jre
drwxr-xr-x 5 root root 4096 Sep 5 15:41 lib
-rw-r--r-- 1 root root 40 Jul 22 05:39 LICENSE
drwxr-xr-x 4 root root 4096 Sep 5 15:41 man
-rw-r--r-- 1 root root 159 Jul 22 05:39 README.html
-rw-r--r-- 1 root root 525 Jul 22 05:39 release
-rw-r--r-- 1 root root 21111703 Jul 22 05:39 src.zip
-rwxr-xr-x 1 root root 63933 Jun 26 16:41 THIRDPARTYLICENSEREADME-JAVAFX.txt
-rw-r--r-- 1 root root 145180 Jul 22 05:39 THIRDPARTYLICENSEREADME.txt

4. 查看版本,因为是rpm包安装,我们可以直接运行:

[root@lnmp soft]# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode, sharing)

5. 删除rpm文件:

[root@lnmp soft]# rm -rf jdk-8u144-linux-i586.rpm

三、JAVA_HOME环境变量

下面我会介绍JAVA_HOME环境变量配置最佳方式!

1. 编辑家目录下的.bash_profile文件,并且在文件最后追加export JAVA_HOME,如下:

[root@lnmp soft]# vim ~/.bash_profile

2. 添加三行内容到文件尾部,如下:

export JAVA_HOME=/usr/java/jdk1.8.0_144/
export JRE_HOME=/usr/java/jdk1.8.0_144/jre
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin

3. 测试 $JAVA_HOME 和 $PATH

[root@lnmp soft]# source ~/.bash_profile
[root@lnmp soft]# echo $JAVA_HOME
/usr/java/jdk1.8.0_144/
[root@lnmp soft]# echo $JRE_HOME
/usr/java/jdk1.8.0_144/jre

到此,我们完成了Java 8的安装,下次将开始部署Elasticsearch,请关注我博客,我将会在不久更新它。

PHP使用phpQuery抓取歌词网站数据实战

近期想研究下elasticsearch,有个问题就是我没有比较好的演示数据,所以就想着扒一扒歌词网站的歌词数据,主要包含如下数据:

  • 分类
  • 歌手
  • 歌曲信息

于是我找到了某歌词网,结构也相对简单,本来准备扒新闻网站的,个人更喜欢音乐吧@_@,这个凭自己喜好了,根据自己的最终目的就行,我只为了得到演示数据,用于学习elasticsearch目的。

歌词网站

我这里选的是http://www.lrcgc.com,不是广告,我是看它页面比较干净,乱七八糟的恶心的站内广告比较少而已,嗯!

phpQuery

这个大概是2010年就停止维护的一个三方类,年代太过久远,不过非常的好使,强烈推荐,使用它正如你使用jquery一样,解析Html或者Xml之类的东西非常舒服。链接:https://code.google.com/archive/p/phpquery

phpQuery的下载

我个人推荐是直接下载单个合成的类文件,很直观,所有的类被集中在一个文件中,链接:https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/phpquery/phpQuery-0.9.5.386-onefile.zip,下载解压后,改个文件名,我这里改成phpQuery.php

或者你也可以去github下载也行,不过我没试过,相关的说明比较少,由于只是临时用用,没去深入研究,有时间可以去github下载,配置比较麻烦点,链接:https://github.com/TobiaszCudnik/phpquery

一、项目文件夹

准备一个文件夹,例如:lyrics_crawler,存放相关的php脚本

二、引入phpQuery.php

将下载好的phpQuery.php复制到项目文件夹lyrics_crawler,再次强调,我下载的是集成的单个类文件。

三、创建一个curl封装类,文件名为Request.php,内容如下:

<?php
/**
* @author: konohanaruto
* @blog: http://www.muyesanren.com
* @QQ: 1039814413
* @wechat number: wikitest
* @date: 2017年9月5日
* @version:
*/

class CurlRequest 
{
    const REQUEST_METHOD_GET = 'get';
    const REQUEST_METHOD_POST = 'post';
    const HTTP_CODE_SUCCESS = 200;
    
    private $conn;
    private $isHttps = false;
    private $requestParam = array();
    private $result;

    /**
     * 验证是否是合法的url
     * 
     * @param string $url
     * @return mixed
     */
    private function checkUrl($url)
    {
    	if (filter_var($url, FILTER_VALIDATE_URL) === false) {
    	    throw new Exception('不是一个有效的url地址!');
    	}
    	
    	return true;
    }

    /**
     * 验证是否是https
     * 
     * @param string $url
     * @return void
     */
    private function checkIsHttps($url = '')
    {
        // 验证是否为合法url
        if ($this->checkUrl($url)) {
            // 确定是否是https
            if (parse_url($url, PHP_URL_SCHEME) == 'https') {
                $this->isHttps = true;
            }
        }
    }
    
    /**
     * 发送请求并返回响应数据
     * 
     * @param string $url
     * @param array $data
     * @param string $method
     * @return mixed
     */
    private function doRequest($url = '', $data = array(), $method = self::REQUEST_METHOD_GET)
    {
        $this->conn = curl_init();
        $this->checkIsHttps($url);
        $this->requestParam = $data;
        curl_setopt($this->conn, CURLOPT_URL, $url);
        curl_setopt($this->conn, CURLOPT_HEADER, 0);
        curl_setopt($this->conn, CURLOPT_RETURNTRANSFER, 1);

        if ($this->isHttps) {
            curl_setopt($this->conn,CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($this->conn,CURLOPT_SSL_VERIFYHOST,2);
        }

        if ($method == self::REQUEST_METHOD_POST) {
            curl_setopt($this->conn, CURLOPT_POST, 1);
            curl_setopt($this->conn, CURLOPT_POSTFIELDS, http_build_query($this->requestParam));
        }
        
        $this->execute();
        $response = curl_getinfo($this->conn);
        
        if ($response['http_code'] != self::HTTP_CODE_SUCCESS) {
            throw new Exception("http code {$response['http_code']}, 请求失败!");
        }
        
        $this->close($this->conn);
        
        return $this->result;
    }

    private function execute()
    {
        $this->result = curl_exec($this->conn);
    }

    public function getRequest($url = '')
    {
        return $this->doRequest($url);
    }

    public function postRequest($url = '', $data = array())
    {
        return $this->doRequest($url, $data, self::REQUEST_METHOD_POST);
    }

    private function close()
    {
        curl_close($this->conn);
    }
}

四、创建一个Worker.php文件,加入如下内容:

<?php
/**
* @author: konohanaruto
* @blog: http://www.muyesanren.com
* @QQ: 1039814413
* @wechat number: wikitest
* @date: 2017年9月5日
* @version:
*/

class Worker
{
	const LYRIC_WEBSITE = 'http://www.lrcgc.com/';
	const SINGER_URL = 'artist-00.html';
	const LIST_NEXT_PAGE_TEXT = '下一页 »';
	
	private $curl;

	public static function getInstance()
	{
	    $instance = new self();
	    $instance->curl = new CurlRequest();
	    
	    return $instance;
	}

    /**
     * 得到所有的歌手分类,华语、日韩、等等
     */
	public function getSingerCategory($url = '')
	{
		$categoryUrl = empty($url) ? self::LYRIC_WEBSITE . self::SINGER_URL : $url;
		$htmlContent = $this->curl->getRequest($categoryUrl);
		$document = $this->domDocument($htmlContent);
		$document = $document['div.forum_menu dd a'];
		$categories = array();
		
		if (! empty($document)) {
		    foreach ($document as $item) {
		        $categories[] = array('link' => self::LYRIC_WEBSITE . pq($item)->attr('href'), 'cat_name' => pq($item)->html());
		    }
		}
		
		return $categories;
	}
	
	/**
	 * 得到单个分类下的所有歌手
	 * 
	 * @param string $link
	 * @return array
	 */
	public function getSingersFromCate($link = '')
	{
	    $singers = array();
	    
	    if (empty($link)) {
	        return $singers;
	    }
	    
	    $content = $this->curl->getRequest($link);
	    $document = $this->domDocument($content);
	    $document = $document['div.namelist li a'];
	    
	    if (! empty($document)) {
	        foreach ($document as $item) {
	            $singers[] = array('link' => self::LYRIC_WEBSITE . pq($item)->attr('href'), 'singer_name' => pq($item)->html());
	        }
	    }
	    
	    return $singers;
	}
	
	/**
	 * 得到歌手的所有歌曲列表
	 * 
	 * @param string $singerLink
	 * @return array
	 */
	public function getSongsOfSinger($singerLink = '', $songs = array())
	{
	    $content = $this->curl->getRequest($singerLink);
	    $document = $this->domDocument($content);
	    $selectedDocument = $document['div.thread_posts_list tr > td:first-child > a'];
	    
	    if ($selectedDocument->length() > 0) {
	        foreach ($selectedDocument as $item) {
	            $songs[] = array('link' => self::LYRIC_WEBSITE . pq($item)->attr('href'), 'song_name' => pq($item)->html());
	        }
	    }
	    
	    // 查看是否存在下一页
	    $pageBarDocument = $document['div.pages_wrap div.pages a:last'];
	    
	    if ($pageBarDocument->length() > 0 && $pageBarDocument->html() == self::LIST_NEXT_PAGE_TEXT) {
	        $songs = $this->getSongsOfSinger(self::LYRIC_WEBSITE . $pageBarDocument->attr('href'), $songs);
	    }
	    
	    return $songs;
	}
	
	/**
	 * 得到歌词
	 * 
	 * @param string $link
	 * @return string
	 */
	public function getLyricContent($link = '')
	{
	    $lyricContent = '';
	    
	    if (empty($link)) {
	        return $lyricContent;
	    }
	    
	    
	    $htmlContent = $this->curl->getRequest($link);
        $document = $this->domDocument($htmlContent);
        $selectedDocument = $document['#J_lyric']->html();
        $reg = "/(\[\d[1-9]:\d{2}\.\d{2}\]|\[[1-9]\d:\d{2}\.\d{2}\]|\[\d{2}:\d[1-9]\.\d{2}\]|\[\d{2}:[1-9]\d\.\d{2}\]|\[\d{2}:\d{2}\.\d[1-9]\]|\[\d{2}:\d{2}\.[1-9]\d\])/u";
        $result = preg_match_all($reg, $selectedDocument, $matches);
        
        // 匹配到记录,然后替换掉正文歌词之前的内容,通过首次大于0的播放时间去判断
        if ($result > 0 && ! empty($matches[1][0])) {
        	$index = strpos($selectedDocument, $matches[1][0]);
        	
        	if ($index !== false) {
        	    $selectedDocument = substr($selectedDocument, $index + strlen($matches[1][0]));
        	}
        }
        
        $selectedDocument = preg_replace($reg, '', $selectedDocument);
        
        return $selectedDocument;
	}
	
	private function domDocument($document)
	{
	    return phpQuery::newDocumentHTML($document);
	}
}

这是我自己简单写的一个类,定义了一些抓取我需要的三个板块数据的方法。

五、创建数据库和表

create database songs;

use songs;

-- 分类表

create table if not exists `singer_categories`(
  `cat_id` smallint unsigned auto_increment,
  `cat_name` varchar(50) not null default '',
  `link` varchar(255) not null default '',
  primary key `pk_cat_id` (`cat_id`)
)engine=innodb default charset='utf8mb4';

-- 歌手

create table if not exists `singers`(
  `singer_id` int unsigned auto_increment,
  `cat_id` smallint unsigned,
  `singer_name` varchar(50) not null default '',
  `link` varchar(255) not null default '',
  primary key `pk_singer_id` (`singer_id`)
)engine=innodb default charset='utf8mb4';

-- 歌曲表

create table if not exists `songs`(
  `songs_id` int unsigned auto_increment,
  `singer_id` int unsigned,
  `song_name` varchar(50) not null default '',
  `link` varchar(255) not null default '',
  `lyric_desc` text,
  primary key `pk_songs_id` (`songs_id`)
)engine=innodb default charset='utf8mb4';

六、创建一个run.php文件,加入如下内容:

<?php
/**
* @author: konohanaruto
* @blog: http://www.muyesanren.com
* @QQ: 1039814413
* @wechat number: wikitest
* @date: 2017年9月5日
* @version:
*/

include 'Request.php';
include 'phpQuery.php';
include 'Worker.php';

set_time_limit(0);
set_exception_handler(function ($exception) {
    echo 'Exception: ' . $exception->getMessage();
    exit;
});

$dsn = 'mysql:dbname=songs;host=192.168.2.133';
$username = 'root';
$password = 'sc19931129';

try {
    $pdo = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}


$worker = Worker::getInstance();
// 歌手分类
$categories = $worker->getSingerCategory();

if (! empty($categories)) {
    foreach ($categories as $item) {
        $sql = "insert into singer_categories (`cat_name`, `link`) values (?, ?)";
        $pdoStmt = $pdo->prepare($sql);
        $pdoStmt->execute(array($item['cat_name'], $item['link']));
        // 得到当前分类id
        $catId = $pdo->lastInsertId();
        
        // 分类下所有歌手
        $singers = $worker->getSingersFromCate($item['link']);
        
        if (! empty($singers)) {
            foreach ($singers as $singerItem) {
                $sql = "INSERT INTO singers (`cat_id`, `singer_name`, `link`) values (?, ?, ?)";
                $pdoStmt = $pdo->prepare($sql);
                $pdoStmt->execute(array($catId, $singerItem['singer_name'], $singerItem['link']));
                // 歌手id
                $singerId = $pdo->lastInsertId();
                
                // 得到所有歌曲
                $songs = $worker->getSongsOfSinger($singerItem['link']);
                
                if (! empty($songs)) {
                    foreach ($songs as $songItem) {
                        // 得到歌词
                        $lyricDesc = $worker->getLyricContent($songItem['link']);
                        $sql = "INSERT INTO songs (`singer_id`, `song_name`, `link`, `lyric_desc`) values (?, ?, ?, ?)";
                        $pdoStmt = $pdo->prepare($sql);
                        $pdoStmt->execute(array($singerId, $songItem['song_name'], $songItem['link'], $lyricDesc));
                    }
                }
            }
        }
    }
}

echo '执行完成! ';

七、文件目录结构如下:

 

八、数据效果图

由于网站会在内容中间或收尾加一些额外的信息,我没做太多处理,这里就打马赛克了,这样我的演示数据就有了,happy~

总结

run.php中是抓取整个网站的所有分类,所有分类下的歌手和他的音乐,由于数据太多,容易hang住,后来发现是脚本运行时不断的占用内存,可能是curl那个地方存在问题,后期我会进行修改。因为目前我没时间去fix它。。。

 

关于php -m显示没有安装openssl扩展的问题

平常我喜欢把php安装到/usr/local/php下,也就是我安装时指定了prefix选项,这样一来我多次会忽略一个问题,虽然在浏览器下看没问题,但是往往我在命令行执行一些脚本时,发现我已经装过的扩展,会提示Not Found!多次碰到这样可笑的问题,但是自己不长记性,这次特地为自己记录下来。虽然编译php我指定了prefix但是php的可执行文件依旧默认在/usr/local/bin目录下,同时也会有一份存在于我指定的/usr/local/php/bin目录下。这次我在命令行使用php请求一个https,提示Unable to find the wrapper “https” – did you forget to enable it when you configured PHP? 这个没有惊讶,因为以前遇到过这个问题,但是当时忘了写博客记录下来,这次又掉了这个坑。因为我浏览器显示的phpinfo中是有openssl这个扩展的,但是为什么我在命令行却没有?

我在命令行运行php -m | grep opensll找不到这个扩展,而且运行下面命令:

php -r "phpinfo();" | grep -i openssl

# 提示如下:

OpenSSL support => disabled

最后发现就是我编译安装php时,指定了prefix,也就是两个地方同时存在php的可执行文件,那么我命令行到底运行的是哪一个呢?我尝试运行:

which php

居然是/usr/local/bin/php,而不是我prefix指定的/usr/local/php/bin/php,出现这个问题也不奇怪,因为PATH环境变量,/usr/local/bin目录是存在于所有后来自己追加的环境变量之前的,解决这个问题,我编辑了我的.bash_profile文件:

vim ~/.bash_profile

# 加入下面这一行:

PATH=/usr/local/php/bin:$PATH

然后退出当前用户重新登录,将会生效,上面也就是我把我的php个人指定的安装目录放到最前面被搜索,因此问题解决了,为了不因为我的个人习惯再次踩进这个坑,今天特地为它写了博文。

CentOS下为已安装的PHP5.6添加GD扩展

以前配置过,但没去更新博文,最近个人开发环境转到了CentOS6.8,重新部署了一遍,正好记录下来,如果使用Docker的兄弟可以略过。。。

主要涉及到如下几个依赖包:

jpegsrc.v6b.tar.gz http://www.ijg.org/files/
libpng-1.6.32.tar.gz http://www.libpng.org/pub/png/libpng.html
zlib-1.2.11.tar.gz https://downloads.sourceforge.net/project/libpng/zlib
freetype-2.6.2.tar.gz https://downloads.sourceforge.net/project/freetype/freetype2/
gd-2.0.33.tar.gz http://www.boutell.com/gd/

开始安装,具体步骤如下:

1.安装zlib

# 我创建的存放软件包的目录/var/soft
[root@lnmp ~]# cd /var/soft
[root@lnmp soft]# wget https://downloads.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz
[root@lnmp soft]# tar xf zlib-1.2.11.tar.gz
[root@lnmp soft]# cd zlib-1.2.11
# 创建程序安装目录,程序名+版本号,这是我个人习惯
[root@lnmp zlib-1.2.11]# mkdir /usr/local/zlib-1.2.11
[root@lnmp zlib-1.2.11]# ./configure --prefix=/usr/local/zlib-1.2.11
[root@lnmp zlib-1.2.11]# make && make install
[root@lnmp zlib-1.2.11]# cd ..

2.安装libpng

[root@lnmp soft]# wget ftp://ftp-osl.osuosl.org/pub/libpng/src/libpng16/libpng-1.6.32.tar.gz
[root@lnmp soft]# tar xf libpng-1.6.32.tar.gz
[root@lnmp soft]# cd libpng-1.6.32
[root@lnmp libpng-1.6.32]# ./configure --prefix=/usr/local/libpng-1.6.32
[root@lnmp libpng-1.6.32]# make && make install
[root@lnmp libpng-1.6.32]# cd ..

3.安装freetype

[root@lnmp soft]# wget https://downloads.sourceforge.net/project/freetype/freetype2/2.6.2/freetype-2.6.2.tar.gz
[root@lnmp soft]# tar xf freetype-2.6.2.tar.gz
[root@lnmp soft]# cd freetype-2.6.2
[root@lnmp freetype-2.6.2]# mkdir /usr/local/freetype-2.6.2
[root@lnmp freetype-2.6.2]# ./configure --prefix=/usr/local/freetype-2.6.2
[root@lnmp freetype-2.6.2]# make && make install
[root@lnmp freetype-2.6.2]# cd ..

4.安装jpeg

[root@lnmp soft]# wget http://www.ijg.org/files/jpegsrc.v9b.tar.gz
[root@lnmp soft]# tar xf jpegsrc.v9b.tar.gz
[root@lnmp soft]# cd jpeg-9b/
[root@lnmp jpeg-9b]# mkdir /usr/local/jpeg-v9b
[root@lnmp jpeg-9b]# ./configure --prefix=/usr/local/jpeg-v9b --enable-shared
[root@lnmp jpeg-9b]# make && make install
[root@lnmp jpeg-9b]# cd ..

5.安装gd

[root@lnmp soft]# wget https://github.com/libgd/libgd/releases/download/gd-2.2.0/libgd-2.2.0.tar.gz

# 下载了三个文件
# drwxr-xr-x 13 8282 users 4096 Aug 31 07:56 libgd-2.2.0
# -rw-r--r-- 1 root root 7239680 May 22 15:18 libgd-2.2.0.tar.gz
# -rw-r--r-- 1 root root 7239680 May 22 15:18 libgd-2.2.0.tar.gz.1

# 直接切换进去
[root@lnmp soft]# cd libgd-2.2.0
[root@lnmp libgd-2.2.0]# mkdir /usr/local/libgd-2.2.0
[root@lnmp libgd-2.2.0]# ./configure --prefix=/usr/local/gd-2.2.0 --with-jpeg=/usr/local/jpeg-v9b --with-png=/usr/local/libpng-1.6.32/ --with-freetype=/usr/local/freetype-2.6.2

6.再次编译PHP

[root@lnmp libgd-2.2.0] cd /var/soft/php-5.6.24/ext/gd
[root@lnmp gd]# ./configure --with-php-config=/usr/local/php/bin/php-config --with-gd=/usr/local/gd-2.2.0 --with-jpeg-dir=/usr/local/jpeg-v9b --with-png-dir=/usr/local/libpng-1.6.32/ --with-freetype-dir=/usr/local/freetype-2.6.2
# 如果出现报错 make: *** [sapi/cli/php] Error 1 , 执行:make clean
#如果出现报错Configure: error: Unable to find gd.h anywhere under /usr/local/gd-2.2.0/
原因就是:gd已经存在了;
解决方法:只需要将--with-gd=/usr/local/gd-2.2.0 修改为--with-gd即可
[root@lnmp gd]# make
[root@lnmp gd]# make install

7.启用gd扩展

打开/etc/php.ini, 添加一行extension=gd.so, 然后service php-fpm restart即可!

CentOS下PHP安装PDO扩展

由于我的是源码编译安装的PHP, 而且我的PHP原始编译目录在/var/soft下,由此先切换到该目录:

cd /var/soft/php-5.6.24/ext

本次重要的两个目录是pdo_mysql, pdo目录,下面简述安装过程:

一、先安装pdo_mysql, 切换进去:

cd /var/soft/php-5.6.24/ext/pdo_mysql

二、执行phpize

说明:phpize位于php安装目录的bin目录下,后面涉及的php-config同理,而且我环境变量添加了php的bin目录,所以在此我可以直接运行。

Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226

如果这一步报错,很可能是你缺少autoconfig包, 具体按照错误提示解决即可。

三、查看下配置帮助

./configure --help | less

四、执行如下命令

./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql

make && make install

说明:根据你自己情况,设置参数,我的php是安装在/usr/local下的php目录,这是我个人习惯。

五、记住上一步完成后的扩展被安装的目录

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

六、确保扩展安装完成

ls -al /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

七、切换到pdo扩展目录

cd /var/soft/php-5.6.24/ext/pdo

八、同第二步

九、编译pdo

./configure --with-php-config=/usr/local/php/bin/php-config

make && make install

十、确保扩展安装成功,同第六步

十一、启用扩展

vim /etc/php.ini

# 没有如下行则添加:

extension=pdo_mysql.so

十二、重启php-fpm

因为我是lnmp环境,如果是apache,只需要重启httpd即可

service php-fpm restart

最后,添加一个脚本info.php

<?php

phpinfo();

截图如下:

Mysql避免输入用户名密码的快捷登录方式

vim ~/.my.cnf, 添加如下内容:

[mysql]
user = root
password = konohanaruto

当然,还有host、port参数也可以指定,这里就不再说明了。

Mysql允许远程主机连接

一、登录Mysql:

注意,请使用具有创建用户权限的用户登录。

二、创建一个用户:

CREATE USER '用户名'@'%' IDENTIFIED BY '用户密码';

%表示允许所有主机访问。

三、分配权限:

GRANT ALL PRIVILEGES ON * . * TO '用户名'@'%';

四、使其马上生效:

FLUSH PRIVILEGES;

Linux手把手搭建samba服务实战

场景描述:平常我比较喜欢在电脑上装Linux虚拟机,作为我的开发环境。因此涉及到windows和linux的文件共享场景,我会装Samba服务器或者NFS之类的软件,今天记录下Samba服务器在CentOS6.8下的安装。

准备:

请确保确定到root用户,可以使用su -命令执行切换,此外请确保禁用了Selinux和防火墙。

第一步:更新yum仓库:

yum update

第二步:安装Samba

yum -y install samba

第三步:创建一个用于操作的用户

useradd konohanaruto -s /sbin/nologin

设置密码:

smbpasswd -a konohanaruto

连续输入两次密码之后,则代表成功创建用户!

如果不想创建新用户也行,但是smbpasswd -a xxxx必须被执行,smb密码和系统用户密码的shadow并不是一样的加密方式,我习惯了root,所以我通常:

smbpasswd -a root

这样就能设置我的密码,再次强调,和系统密码没半毛钱关系,这里改了smb密码后系统用户密码不会被改变,反之一样!

第四步:修改配置文件

vim /etc/samba/smb.conf 在内容最后加上如下内容:

[Development]
comment = Project Directory
path = /www/
create mask = 755
directory mask = 777
writeable = yes
browseable = yes

说明:

[Development]:访问时的显示名称
path:你需要共享的目录
create mask:创建文件后的文件所具有的权限,由于受umask影响,虽然设置755,最终可能还会是744权限
directory mask:同上
writeable:目录是否可写入
browseable:是否可以浏览目录内容

最后在window端访问我的共享:

会提示输入用户名和密码,按照你的设定输入即可,然后将会看到:

接着:

最后将可以看到像本地磁盘一般,挂载在我们的windows主机上:

© 2019 木叶三忍的博客. All rights reserved.

Theme by Anders Norén.