刘华世的官方博客

PHP 安装

PHP 安装


如何下载Apache,php,mysql

下载Apache

图片

打开网址:http://httpd.apache.org/。

点击Download(http://httpd.apache.org/download.cgi#apache24)进入到详细页面。

图片

可以看到这里有源码,二进制的版本,我们选择Windows版本。

点击后进入:http://httpd.apache.org/docs/current/platform/windows.html#down

图片

可以看到官网已经做出说明,现在不再提供编译后的文件,只提供源码。好吧用第三方的。

我们可以从前三个网址下载相应版本,也可以使用WampServer和XAMPP集成包。

图片

接下来就根据自己的系统选择相应的版本,x86是32位系统,x64是64位系统。

Apache是有环境依赖的,需要打上相应的VC运行库,如VC14等。

下载php

图片

打开php官网的下载链接:http://php.net/downloads.php。

点击Windows downloads进入下载页面。

图片

根据系统下载相应的版本,如64位则下载x64的版本。

如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程 安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。

下载mysql

图片

从官网进入下载地址要多点几下。

图片

打开网址http://dev.mysql.com/downloads/mysql

点击Download进行下载吧。

图片

官网的速度还是比较慢的,这里就提供一个国内的镜像吧。

打开镜像网址:http://mirrors.sohu.com/mysql/

图片

直接下载就可以了,如:http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.34-winx64.zip。

常用的国内镜像站

搜狐开源镜像站:http://mirrors.sohu.com/

网易开源镜像站:http://mirrors.163.com/

开源中国:http://mirrors.oschina.net/

首都在线科技股份有限公司:http://mirrors.yun-idc.com/

阿里云开源镜像:http://mirrors.aliyun.com/

如何配置Apache,php,mysql

配置Apache

图片

php是用C语言进行编译的,如果没有安装VC相应的运行库,提示内容会很奇怪。如“提示NET HELPMSG 3547”。

在语句填写正确的情况下,VC环境也是造成其报错的原因之一,切记。

VC库对应的版本如下:

Visual C++ 2003 运行库(VC7)

Visual C++ 2005 运行库(VC8)

Visual C++ 2008 运行库(VC9)

Visual C++ 2010 运行库(VC10)

Visual C++ 2012 运行库(VC11)

Visual C++ 2013 运行库(VC12)

Visual C++ 2015 运行库(VC14)

对http.conf(D:\phpEnv\Apache24\conf\http.conf)配置文件进行修改-使用记事本打开就行
httpd.conf的具体设置如下:
(1)修改ServerRoot Apache的根路径:
    (37行)
    ServerRoot"c:/Apache24"改成=>ServerRoot "D:/phpEnv/Apache24"
(2)修改ServerName你的主机名称:
    如果此行不修改则启动apache 提示Starting httpd: AH00558
    (217行)
    ServerName www.example.com:80将前面的#去掉,该属性在从命令行启动Apache时需要用到。
(3)修改DocumentRoot Apache访问的主文件夹目录,就是php、html代码文件的位置。
Apache默认的路径是在htdocs(D:\phpEnv\Apache24\htdocs)下面,里面会有个简单的入口文件index.html。这个路径可以自
己进行修改,我这里将其配置在我自己新建的文件夹www(D:\phpEnv\www)下。
    (247行)
    DocumentRoot "c:/Apache24/htdocs"
    <Directory "c:/Apache24/htdocs">
    改为=>
    DocumentRoot "D:\phpEnv\www"
    <Directory "D:\phpEnv\www">
(4)修改入口文件配置:DirectoryIndex一般情况下我们都是以index.php、index.html、index.htm作为web项目的入口。
Apache默认的入口只有index.html需要添加其他两个的支持,当然这个入口文件的设置可以根据自己的需要增减,如果要求比较严
格的话可以只写一个index.php,这样在项目里面的入口就只能是index.php
    (274行)
    <IfModule dir_module>
    DirectoryIndex index.html
    </IfModule>
    改为=>
    <IfModule dir_module>
    DirectoryIndex  index.php index.htm index.html
    </IfModule>
(5)设定serverscript的目录:
    (358行)
    ScriptAlias /cgi-bin/ "c:/Apache24/cgi-bin/"
    改为=>
    ScriptAlias /cgi-bin/ "D:/phpEnv/Apache24/cgi-bin"
(6)设定虚拟目录路径,多站点为上级目录
    (380行)
    <Directory "c:/Apache24/cgi-bin">
      AllowOverride None
      Options None
      Require all granted
    </Directory>
    改为=>
    <Directory "D:/phpEnv/Apache24/cgi-bin">
      AllowOverride None
      Options None
      Require all granted
</Directory>

注册服务和启动服务

将Apache解压到C:\www\Apache24\,进入C:\www\Apache24\bin

图片

配置Apache_错误解决办法

查看apache错误日志:目录下的apache/logs/error.log

查看window系统日志:我的电脑右键管理系统工具事件查看器应用程序日志

在命令行中使用netstat -ano就可以很清楚的看到本地80口占用程序PID记下PID然后打开任务管理器,在进程里查找到PID所对应的进程

图片

如上图,则修改C:\www\Apache24\httpd.conf里面的目录路径,将C: \Apache24更改为C:\www\Apache24。

图片

到这里单个Apache配置就已经完成。

配置PHP

将php-5.6.12-Win32-VC11-x86.zip解压到目录,然后在Apache24\conf\httpd.conf中进行配置:

Php的一些常用配置修改:(D:\phpEnv\php\php.ini)

时区的设置:date.timezone = Asia/Shanghai

错误报告等级:error_reporting = E_ALL这个在开发模式下可以全部打开。

配置MYSQL

修改配置文件:C:\mysql\my.ini

注意:MySQL的管理员用户名为root,密码默认为空。

修改配置文件:打开php的配置文件php.ini(D:\phpEnv\php\php.ini)

1)PHP对扩展的支持(721行)
#这里需要注意一下,如果只用ext做为扩展路径而不是全路径,容易导致扩展路径出错。向httpd.exe传相对路径就会定们出错。所以最好使用全路径。
    ; extension_dir = "ext",去掉前面的“;”,并改为extension_dir ="D:\phpEnv\php\ext"打开php的扩展支持,ext文件夹下有很多php的扩展支持.dll文件,感兴趣的同学可以看一下。
(2)然后就是打开php的mysql扩展了
    (875、876行)去掉前面的“;”
    extension=php_mysql.dll
    extension=php_mysqli.dll
当然也可以打开881行的php_pdo_mysql.dll启用php的pdo支持我一般都用这个。

MYSQL修改root密码

  • 方法1: 用SET PASSWORD命令
  • 方法2: 用mysqladmin
  • 方法3: 用UPDATE直接编辑user表
mysqladmin -u root password "newpass"

方法1: 用SET PASSWORD命令

首先登录MySQL。

格式:mysql> set password for 用户名@localhost = password('新密码');

例子:mysql> set password for root@localhost = password('123');

方法2:用mysqladmin

格式:mysqladmin -u用户名 -p旧密码 password 新密码

例子:mysqladmin -uroot -p123456 password 123

方法3:用UPDATE直接编辑user表

首先登录MySQL。

mysql> use mysql;

mysql> update user set password=password('123') where user='root' and host='localhost';

mysql> flush privileges;

方法4:在忘记root密码的时候,可以这样 以windows为例:

  1. 关闭正在运行的MySQL服务。
  2. 打开DOS窗口,转到mysql\bin目录。
  3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。
  4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
  5. 输入mysql回车,如果成功,将出现MySQL提示符 >。
  6. 连接权限数据库: use mysql; 。
  7. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。
  8. 刷新权限(必须步骤):flush privileges; 。
  9. 退出 quit。
  10. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。

如何在本地配置两个站点

让Apache在启动时能加载虚拟主机模块。

打开Apache安装目录下conf/httpd.conf文件,找到下面两行文字,把最前面的 # 号去掉,然后保存。

图片

接着找到同一文件中的DocumentRoot和Directory,改为站点目录的上一级目录

例如站点放在 D:/Appserv/www/1 和 D:/Appserv/www/2,则改为以下形式

配置完成后即可打开Apache安装目录下/conf/extra/httpd-vhosts.conf文件,在最后添加如下:

DocumentRoot是文件放置路径,ServerName是网站域名:

图片

配置PHP+PhpStorm+xdebug

下载xdebug文件

http://xdebug.org/wizard.php

将phpinfo()的源代码复制到文本框中,xdebug会提示如何配置和下载哪个版本的xdebug。

全部下载地址:

http://www.xdebug.org/download.php

在xdebug官网会有许多安装提示。其中可能会出现的问题有:

phpize没有安装:继而又要安装brew,再安装autoconf可谓一波三折

图片

解决相关组件不全的问题

问题描述
Mac系统升级到10.9(mavericks)时安装php扩展,执行 phpize 提示如下错误:
Cannot find autoconf. Please check your autoconf installation
and the $PHP_AUTOCONF environment variable.
解决办法
先安装Homebrew:
如果以下链接失效的话,可以到brew官网查看。http://brew.sh/
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后安装 autoconf:
brew install autoconf

配置php.ini,在末尾加上

在xdebug官网上的配置,只能够正确配置好xdebug但是不能与phpstorm进行配置。在php.ini末尾加上如下代码:
[xdebug]
zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so"
xdebug.remote_enable = On
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "localhost"
xdebug.remote_port = 9000
xdebug.idekey = PHPSTROM

[xdebug]
zend_extension="php_xdebug-2.3.3-5.6-vc11.dll"
xdebug.remote_enable = On
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "localhost"
xdebug.remote_port = 9000
xdebug.idekey = PHPSTORM

图片

zend_extension:如果使用相对路径,必须检查一下,php.ini中extension_dir是否为绝对路径。

Debug->Xdebug->Debug port:必须与php.ini文件中的xdebug.remote_port保持一致。

chrome的xdebug配置

在IDE key里将其配置成“phpStorm”

项目地址:https://github.com/mac-cain13/xdebug-helper-for-chrome

包直接下载地址:https://clients2.google.com/service/update2/crx?response=redirect&prodversion=38.0&x=id%3Deadndfjplgieldj bigjakmdgkmoaaaoc%26installsource%3Dondemand%26uc

图片

进入网址:http://yurl.sinaapp.com/crx.php

输入包名:eadndfjplgieldjbigjakmdgkmoaaaoc

安装:

图片

打开chrome,输入:chrome://extensions/

然后将extension_1_6_1.crx拖放到浏览器窗口。

phpStorm的相关配置

打开phpStorm,

进入File>Settings>PHP>Servers,这里要填写服务器端的相关信息,name填localhost,host填localhost,port填80,debugger选XDebug

进入File>Settings>PHP>Debug,看到XDebug选项卡,port填9000,其他默认

进入File>Settings>PHP>Debug>DBGp Proxy,IDE key 填 phpStorm,host 填localhost,port 填80

点OK退出设置。

xdebug中其他配置

在phpStorm里打开监听(电话按钮)。

对apache进行重启,如使用命令行:net stop apache24 & net start apache24;

查看xdebug是否正确配置:进入到php.exe目录:执行php.exe -m可以查看相关模块。

图片

#重启apache
sudo apachectl restart
#修改php.ini权限
sudo chmod 0777 php.ini
#编辑php.ini文件
sudo vi php.ini(修改i,退出:q,保存退出:wq)
#对apache进行重启,如使用命令行:
net stop apache24 & net start apache24;

在phpinfo()中进行验证其是否安装成功,如果不成功先检查路径,后检查端口。

配置phpMyAdmin

进入官网下载压缩包:https://www.phpmyadmin.net/

将phpMyAdmin解压到虚拟目录(www.1.com)

访问phpMyAdmin:http://www.1.com/phpMyAdmin

要开启插件extension=php_mbstring.dll

用户名默认为root,密码为空。设置密码的方法:mysqladmin -u root password "newpass"

使用空密码进入phpMyAdmin:

phpMyAdmin的配置文件为根目录下的:config.inc.php(将config.sample.inc.php复制改名可得。复制libraries/config.default.php亦可。)

修改:$cfg['Servers'][$i]['AllowNoPassword'] = true;即可。

MAC平台补充

启动Apache

打开终端(terminal)

进入到root目录:sudo -i;sudo su。

运行”sudo apachectl start”,输入root密码,这样就启动了Apache。

默认虚拟目录:/Library/WebServer/Documents/下。

常用命令行:

网址:http://httpd.apache.org/docs/2.4/programs/apachectl.html

sudo apachectl start
sudo apachectl stop
sudo apachectl restart

运行php

在终端中运行“sudo vi /etc/apache2/httpd.conf”。

找到“#LoadModule php5_module libexec/apache2/libphp5.so”,把#号去掉,保存(在命令行输入:w)并退出vi(在命令行输入:q)。

运行“sudo cp /etc/php.ini.default /etc/php.ini”,这样就可以运行sudo vi /etc/php.ini来编辑php.ini配置各种功能了。比如:

;通过下面两项来调整PHP提交文件的最大值,如phpMyAdmin中导入数据的最大值
upload_max_filesize = 2M
post_max_size = 8M
;通过display_errors来控制是否显示PHP程序的报错信息,这在调试PHP程序时非常有用
display_errors = Off
;增加mysql的支持:
extension=php_mysql.dll

运行“sudo apachectl restart”,重启Apache,这样PHP就可以用了。

安装Mysql

从5.7开始安装的时候会默认生成密码,一定要截图记住密码。

系统偏好设置->MySQL->Start MySQL Server就可以开启服务。

使用xampp

个人感觉在Mac平台下,自己安装如果顺利倒也简单,但毕竟依赖太多,纵使你精通某一方面,但bug涉及的面太多。如果仅仅是配置个php+apache+mysql还是很简单的,系统本身就有php环境,如果要扩展一下那就......还是算了吧,用集成环境也是一个不错的选择。

先到官网下载集合包:https://www.apachefriends.org

https://www.apachefriends.org/xampp-files/5.6.28/xampp-osx-5.6.28-1-installer.dmg

到Mac本地后,双击安装吧!

其xampp的默认目录为:/Applications/xampp/

安装xdebug

感觉PHP都自带了一个版本的xdebug一般情况下不用自己去编译, 比如说xampp的文件在/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so。

好了,借花献佛,跳过了phpize等烦人的依赖。

在Mac下配置xampp+xdebug

下载XAMPP:https://www.apachefriends.org/xampp-files/5.6.28/xampp-osx-5.6.28-1-installer.dmg

安装XAMPP:

图片

图片

配置文件在/Applications/XAMPP/xamppfiles/etc/目录下面:

修改php.ini,httpd.conf,/extra/httpd-vhosts.conf

根据http://xdebug.org/wizard.php 做如下修改:

在php.ini增加xdebug支持:

在httpd.conf修改多站点支持,和虚拟目录:

在/extra/httpd-vhosts.conf中配置域名转向:

到此配置的就OK了,phpstorm的配置可以参照windows的配置。

相关问题

如何将apache添加为服务

httpd.exe -k install -n "Apache24"
rem httpd.exe -k uninstall -n "Apache24"

如何查看apache服务是否安装成功

#rem 在findstr的参数/I有不分大小写的作用
net start|findstr /I "apache"
#使用资源管理器查看
开始-->运行-->services.msc-->确定

如何解决apache服务无法正常安装的问题

#首先确定软件32位和64位是否和自己的系统匹配
#安装相应的Microsoft Visual C++ Redistributable

如何解决端口被占用的问题

#查看80端口是否被占用:
netstat -aon|findstr "80"
#打开apache目录下的conf/httpd.conf
修改"Listen 80"为"Listen 8088"

如何添加环境变量

#运行SystemPropertiesAdvanced.exe,系统属性高级
#环境变量Path,末尾添加,分号结束

如何改变服务器网站目录

#打开文件/conf/httpd.conf
#修改ServerRoot(服务器apache目录)
#修改DocumentRoot(网站目录)

相关环境

AppServ集成环境(Windows):http://www.appservnetwork.com

XAMPP集成环境(Windows,Linux,Mac):http://www.apachefriends.org

WAMP集成环境(64/32位Windows):http://http://www.wampserver.com/

PHP_环境配置_python脚本

# -*- coding: cp936 -*-
#Writeby:Moments(衿华客)
#Date:201701111954
import os
import zipfile
import shutil

class Moments:
    def __init__(self):
        print("Hello Moments")
        pass

    #path:要解压文件的路径,dir_name:解压到哪个文件夹,dir_zip:只解压压缩包里的某个文件夹,dir_rename:将解压后的文件夹重命名
    def unZip(self, path="", dir_name="", dir_zip=[], dir_rename=[]):
        if path == "":
            print("【ERROR:要解压文件的路径为空】")
            return False
        if len(dir_rename) > 0 and os.path.exists(dir_rename[1]):
            print("【WARN:将解压后的文件夹重命名,目标文件夹%s已经存在】" % dir_rename[1])
            return False
        #解压操作
        file = zipfile.ZipFile(path, "r")
        for name in file.namelist():
            #只解压指定的文件夹
            if len(dir_zip) > 0:                
                for i in dir_zip:
                    if i in name:
                        file.extract(name, os.getcwd()+"/"+dir_name)
            else:
                file.extract(name, os.getcwd()+"/"+dir_name)
        #改名操作
        if len(dir_rename) > 0:            
            file_list = os.listdir(os.getcwd())
            for name in file_list:
                if not os.path.isdir(name):
                    continue
                if dir_rename[0] in name:
                    os.rename(name, dir_rename[1])
                    break #只改第一个,防止多个问题
        #析构提示                    
        print("【SUCCEED:已解压" + path + "到目录" + dir_name + "】")

    #遍历目录,返回符合条件的路径
    def listDir(self, path=".", *argc):
        file_list = os.listdir(path) #遍历路径
        flag_temp = True #哨兵
        result = [] #返回值变量
        for name in file_list:            
            for argv in argc:            
                if argv not in name:
                    flag_temp = False
                    break
            if flag_temp:
                result.append( os.path.abspath(name) )
            else:
                flag_temp = True
        if len(result) > 0:
            print("【SUCCEED:找到符合条件的文件:%s】" % result)
            return result
        else:
            print("【ERROR:没有找到条例条件的文件/文件夹】")
            return False

    #配置Apache,php,mysql
    def configPHP(self, APM_name=["Apache", "php", "mysql"]):
        #配置php
        config_name = os.path.abspath(".").replace("\\", "/") + "/" + APM_name[1] + "/php.ini"
        print("【PATH:配置%s】" % config_name)
        if os.path.exists(config_name):
            os.remove(config_name)
        f1 = open(config_name.replace("php.ini", "php.ini-production"), "r").readlines()
        f2 = open(config_name, "w")
        for line1 in f1:
            #这里要用绝对路径,不然会导致抓取到Apache\bin下的ext。
            #包括xdebug在配置的时候也会出现目录问题。
            if '''extension_dir = "ext"''' in line1:
                line1  = '''extension_dir = "%s/ext"\n''' % (os.path.abspath(".").replace("\\", "/") + "/" + APM_name[1])
            elif ''';extension=php_mysql.dll''' in line1:
                line1 = '''extension=php_mysql.dll\n'''
            elif ''';extension=php_mysqli.dll''' in line1:
                line1 = '''extension=php_mysqli.dll\n'''
            elif ''';extension=php_pdo_mysql.dll''' in line1:
                line1 = '''extension=php_pdo_mysql.dll\n'''
            elif ''';extension=php_gd2.dll''' in line1:
                line1 = '''extension=php_gd2.dll\n'''
            elif ''';extension=php_mbstring.dll''' in line1:
                line1 = '''extension=php_mbstring.dll'''
            else:
                pass
            f2.write(line1)
        f2.close()
        print("【SUCCEED:完成%s配置】" % APM_name[1])

    def configMysql(self, APM_name=["Apache", "php", "mysql"]):
        #配置mysql
        config_name = os.path.abspath(".").replace("\\", "/") + "/" + APM_name[2] + "/my.ini"
        print("【PATH:配置%s】" % config_name)
        if os.path.exists(config_name):
            os.remove(config_name)
        f1 = open(config_name.replace("my.ini", "my-default.ini"), "r").readlines()
        f2 = open(config_name, "w")
        for line1 in f1:
            if "basedir" in line1:
                line1 = "basedir = %s\n" % (os.path.abspath(".").replace("\\","/") + "/" + APM_name[2])
            elif "datadir" in line1:
                line1 = "datadir = %s\n" % (os.path.abspath(".").replace("\\","/") + "/" + APM_name[2] + "/data")
            elif "port" in line1:
                line1 = "port = 3306\n"
            else:
                pass
            f2.write(line1)
        f2.write("""# 服务端的编码方式
character-set-server = utf8
[client]
#客户端编码方式,最好和服务端保存一致
loose-default-character-set = utf8""")    
        f2.close()
        print("【SUCCEED:完成%s配置】" % APM_name[2])

    def configApache(self, APM_name=["Apache", "php", "mysql"]):
        #配置Apache
        config_name = os.path.abspath(".").replace("\\", "/") + "/" + APM_name[0] + "/conf/httpd.conf"
        print("【PATH:配置%s】" % config_name)
        if not os.path.exists(config_name.replace("httpd.conf", "httpd.conf.bak")):
            shutil.copy(config_name, config_name.replace("httpd.conf", "httpd.conf.bak"))
        if os.path.exists(config_name):
            os.remove(config_name)
        f1 = open(config_name.replace("httpd.conf", "httpd.conf.bak"), "r").readlines()
        f2 = open(config_name, "w")
        for line1 in f1:
            #更改默认目录
            if "c:/Apache24" in line1:
                line1 = line1.replace("c:/Apache24", os.path.abspath(".").replace("\\", "/")+"/"+APM_name[0])
            #添加默认主页支持
            elif '''DirectoryIndex index.html''' in line1:
                line1 = line1.replace('''DirectoryIndex index.html''', '''DirectoryIndex index.html, index.php''')
            #添加支持php5    
            elif '''<IfModule unixd_module>''' in line1:
                line1 = '''# php5 support

LoadModule php5_module "%s/%s/php5apache2_4.dll"

AddHandler application/x-httpd-php .php
AddType application/x-httpd-php .html .htm

# configure the path to php.ini

PHPIniDir "%s/%s"

''' % (os.path.abspath(".").replace("\\","/"), APM_name[1], os.path.abspath(".").replace("\\","/"), APM_name[1]) + line1
            else:
                pass
            f2.write(line1)
        f2.close()
        if not os.path.exists(os.path.abspath(".").replace("\\","/") + "/" + APM_name[1] + "/php5apache2_4.dll"):
            print("【ERROR:没有找到php5所需文件!%s,请手动更改.】" % os.path.abspath(".").replace("\\","/")+"/php/php5apache2_4.dll")
        else:
            print("【SUCCEED:完成%s配置】" % APM_name[0])

    #重新注册并启动服务
    def netRestart(self, APM_name=["Apache", "php", "mysql"]):
        if len(APM_name) >= 1:
            #卸载Apache服务
            s = os.path.abspath(".").replace("\\","/") + "/" + APM_name[0] + '/bin/httpd.exe -k uninstall -n "%s"' % APM_name[0]
            #结束所有httpdf.exe进程
            s = s + " & " + "taskkill /F /IM httpd.exe /T"
            #注册Apache服务
            s = s + " & " + os.path.abspath(".").replace("\\","/") + "/" + APM_name[0] + '/bin/httpd.exe -k install -n "%s"' % APM_name[0]
        if len(APM_name) >= 3:
            #卸载mysql服务
            s = s + " & " + os.path.abspath(".").replace("\\","/") + "/" + APM_name[2] + "/bin/mysqld.exe --remove " + APM_name[2]
            #注册mysql服务
            s = s + " & " + os.path.abspath(".").replace("\\","/") + "/" + APM_name[2] + "/bin/mysqld.exe --install " + APM_name[2]
        if len(APM_name) >= 1:
            #重新启动服务
            s = s + " & " + "net stop %s & net start %s" % (APM_name[0], APM_name[0])
        if len(APM_name) >= 3:
            #重新启动服务
            s = s + " & " + "net stop %s & net start %s" % (APM_name[2], APM_name[2])
        #暂停几秒钟
        s = s + " & ping localhost -n 3 > nul"
        #执行以上语句
        print("【PATH:%s】" % s)
        try:
            os.system(s)
        except Exception as e:
            print("【ERROR:%s】" % e)
        if len(APM_name) >= 1:
            print("【SUCCEED:%s注册服务和启动服务完成!】" % (APM_name[0]))
        if len(APM_name) >= 3:
            print("【SUCCEED:%s注册服务和启动服务完成!】" % (APM_name[2]))        

    #删除Apache服务和mysql服务
    def netDel(self, APM_name=["Apache", "php", "mysql"]):
        if len(APM_name) >= 1:
            #卸载Apache服务
            s = os.path.abspath(".").replace("\\","/") + "/" + APM_name[0] + '/bin/httpd.exe -k uninstall -n "%s"' % APM_name[0]    
            #结束所有httpdf.exe进程
            s = s + " & " + "taskkill /F /IM httpd.exe /T"     
        if len(APM_name) >= 3:
            #卸载mysql服务
            s = s + " & " + os.path.abspath(".").replace("\\","/") + "/" + APM_name[2] + "/bin/mysqld.exe --remove " + APM_name[2]
        if len(APM_name) >= 1:            
            #关闭Apache服务
            s = s + " & " + "net stop %s" % (APM_name[0])
        if len(APM_name) >= 3:
            #关闭Mysql服务
            s = s + " & " + "net stop %s" % (APM_name[2])        
        #暂停几秒钟
        #s = s + " & ping localhost -n 3 > nul"
        #执行以上语句
        print("【PATH:%s】" % s)
        try:
            os.system(s)
        except Exception as e:
            print("【ERROR:%s】" % e)
        if len(APM_name) >= 1:
            print("【SUCCEED:删除Apache服务,%s已经停止!】" % (APM_name[0]))
        if len(APM_name) >= 3:
            print("【SUCCEED:删除mysql服务,%s已经停止!】" % (APM_name[2]))

    #配置Apache多站点
    def multiConfig(self, APM_name=["Apache", "php", "mysql"], dir_multi = {"www_1_com":"www.1.com","www_2_com":"www.2.com"}):        
        config_name = os.path.abspath(".").replace("\\", "/") + "/" + APM_name[0] + "/conf/httpd.conf"
        print("【PATH:配置多站点%s】" % config_name)
        f1 = open(config_name, "r").readlines()
        f2 = open(config_name, "w")
        for line1 in f1:
            #设置为根目录
            line1 = line1.replace("%s/htdocs" % (os.path.abspath(".").replace("\\", "/") + "/" + APM_name[0]), 
            os.path.abspath(".").replace("\\", "/")[:3])
            #设置为上级目录
            #line1 = line1.replace("%s/htdocs" % APM_name[0], "")
            if 'mod_vhost_alias.so' in line1:
                line1 = line1.replace("#","")
            elif 'httpd-vhosts.conf' in line1:
                line1 = line1.replace("#","")
            else:
                pass
            f2.write(line1)
        f2.close()

        config_name = os.path.abspath(".").replace("\\", "/") + "/" + APM_name[0] + "/conf/extra/httpd-vhosts.conf"
        print("【PATH:配置多站点%s】" % config_name)
        if not os.path.exists(config_name.replace("httpd-vhosts.conf", "httpd-vhosts.conf.bak")):
            shutil.copy(config_name, config_name.replace("httpd-vhosts.conf", "httpd-vhosts.conf.bak"))
        if os.path.exists(config_name):
            os.remove(config_name)
        f1 = open(config_name.replace("httpd-vhosts.conf", "httpd-vhosts.conf.bak"), "r").read()
        f2 = open(config_name, "a")
        f2.write(f1)
        if len(dir_multi) > 0:
            for k, v in dir_multi.items():                
                f2.write('''<VirtualHost *:80>
DocumentRoot "%s%s"
ServerName   %s
</VirtualHost>
''' % 
(os.path.abspath(".").replace("\\","/")[:3] + "/", k, v)) #根目录
#(os.path.abspath(".").replace("\\","/") + "/", k, v)) #同级目录
                #目录创建
                #根目录
                if not os.path.exists(os.path.abspath(".").replace("\\","/")[:3]+"/"+k):
                    os.mkdir(os.path.abspath(".").replace("\\","/")[:3]+"/"+k)                
                #同级目录
                #if not os.path.exists(os.path.abspath(".").replace("\\","/")+"/"+k):
                #    os.mkdir(os.path.abspath(".").replace("\\","/")+"/"+k)
                #修改HOSTS文件
                try:
                    f_hosts = open(os.environ['SYSTEMROOT']+"/System32/drivers/etc/hosts", "a")
                    print("【PATH:配置%s】" % (os.environ['SYSTEMROOT']+"/System32/drivers/etc/hosts"))
                    f_hosts.write("\n127.0.0.1 %s" % v)
                    f_hosts.close()
                except Exception as e:
                    print("【ERROR:没有权限修改hosts文件,请手动修改。】")
        f2.close()
        print("【SUCCEED:完成%s多站点配置】" % APM_name[0])

    #配置扩展xdebug
    def configXdebug(self, APM_name=["Apache", "php", "mysql"], xdebug_name=""):
        #配置php
        config_name = os.path.abspath(".").replace("\\", "/") + "/" + APM_name[1] + "/php.ini"
        print("【PATH:xdebug中配置%s】" % config_name)
        f2 = open(config_name, "a")
        f2.write('''
[xdebug]
zend_extension="%s"
xdebug.remote_enable = On
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "localhost"
xdebug.remote_port = 9000
xdebug.idekey = PHPSTORM
''' % (xdebug_name))
        f2.close()
        print("【SUCCEED:完成%s配置】" % APM_name[1])    

def step1(mo, APM_name = ["Apache", "php", "mysql"]):
    #删除Apache服务和mysql服务
    mo.netDel(APM_name)
    #path:要解压文件的路径,dir_name:解压到哪个文件夹,dir_zip:只解压压缩包里的某个文件夹,dir_rename:将解压后的文件夹重命名
    try:
        if len(APM_name) >= 1:
            var_php = mo.listDir(".", "zip", "httpd")
            [mo.unZip(path, "", ["Apache24"], ["Apache24", APM_name[0]]) for path in var_php]    
    except Exception as e:
        print("【ERROR:%s】" % e)

    try:
        if len(APM_name) >= 2:
            var_php = mo.listDir(".", "zip", "php")
            [mo.unZip(path, "php", [], ["php", APM_name[1]]) for path in var_php]
    except Exception as e:
        print("【ERROR:%s】" % e)

    try:
        if len(APM_name) >= 3:
            var_php = mo.listDir(".", "zip", "mysql")
            [mo.unZip(path, "", ["mysql"], ["mysql-5.6.26", APM_name[2]]) for path in var_php]    
    except Exception as e:
        print("【ERROR:%s】" % e)

def step2(mo, APM_name = ["Apache", "php", "mysql"]):
    #配置Apache,php,mysql   
    for name in APM_name:
        if os.path.exists(name):
            print("【SUCCEED:找到文件夹 %s】" % name)
        else:
            print("【ERROR:没有找到文件夹 %s】" % name)

    try:
        if len(APM_name) >= 2:
            mo.configPHP(APM_name)
    except Exception as e:
        print("【ERROR:%s】" % e)

    try:
        if len(APM_name) >= 1:
            mo.configMysql(["Apache", "php", "mysql"])
    except Exception as e:
        print("【ERROR:%s】" % e)

    try:
        if len(APM_name) >= 1:
            mo.configApache(APM_name)
    except Exception as e:
        print("【ERROR:%s】" % e)        

def step3(mo, APM_name = ["Apache", "php", "mysql"], dir_multi = {"www_1_com":"www.1.com","www_2_com":"www.2.com"}):
    #配置Apache多站点
    try:
        if len(APM_name) >= 1:
            mo.multiConfig(APM_name, dir_multi)
    except Exception as e:
        print("【ERROR:%s】" % e)

def step4(mo, APM_name = ["Apache", "php", "mysql"], xdebug_name=""):
    file_list = os.listdir(".")
    for name in file_list:
        if xdebug_name in name and len(APM_name) >= 2:            
            shutil.copy(name, APM_name[1]+"/ext")
            print("【SUCCEED:成功复制文件 %s 到目录 %s】" % (name, APM_name[1]+"/ext"))
            mo.configXdebug(APM_name, name)

def step9(mo, APM_name = ["Apache", "php", "mysql"]):
    #重新注册并启动服务
    mo.netRestart(APM_name)    

#测试代码
if __name__ == "__main__":
    mo = Moments()
    APM_name = ["Apache", "php", "mysql"]
    dir_multi = {"www.1.com":"www.1.com"}
    xdebug_name = "php_xdebug-2.5.0-5.6-vc11-x86_64.dll"
    step1(mo, APM_name) #解压重命名
    step2(mo, APM_name) #配置Apache,php,mysql
    step3(mo, APM_name, dir_multi) #配置Apache多站点
    step4(mo, APM_name, xdebug_name) #配置xdebug    
    step9(mo, APM_name) #重新注册并启动服务

 

 

 

 

衿华客

php 教程

  1. PHP简介
  2. PHP安装
  3. PHP语法
  4. PHP数据类型
  5. PHP变量
  6. PHP运算符
  7. PHP流程控制
  8. PHP函数
  9. PHP类与对象
  10. PHP字符串
  11. PHP正则表达示
  12. PHP文件
  13. PHP图形图像
  14. PHPXML
  15. PHP会话缓存
  16. PHP异常处理
  17. PHP数据库
  18. PHP日期时间戳
  19. PHP代码风格规范

server 环境

  1. ubuntu入门
  2. docker入门
  3. git入门
  4. iterm入门

frame 框架

  1. laravel入门
  2. dingo入门
  3. JWT入门
  4. Laravel框架关键技术解析
  5. laravel则修笔记
  6. rpc入门
  7. rabbitmq入门
  8. opencc多国语言
  9. laravel兄弟连笔记
  10. laravel进阶

case 实例

  1. php面试题笔记
  2. python图标提取
  3. 字幕乱码问题
  4. 支付宝接口调用
  5. laravel开发笔记

db 数据库

  1. elasticsearch入门
  2. 数据库操作
  3. 数据库设计
  4. redis入门

help

posted @ 2017-07-10 13:26  刘华世的博客  阅读(372)  评论(0编辑  收藏  举报
刘华世的官方博客