简介
本文源自公司内部使用wordpress搭建了一套官网,经常有定制化的需求,有些插件实现不了,需要通过phpstorm调试的方式熟悉wordpress,同时修改php代码,本地测试环境window,适合用wamp作为php运行环境,同时带apache+mysql。
- WAMP:是Windows、Apache、MySQL和PHP的缩写,它是一个软件堆栈,这意味着在操作系统(Windows)上安装Apache、MySQL和PHP。
- phpstorm:PhpStorm 是 JetBrains 公司开发的一款商业的PHP集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。
- wordpress:WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用,可以用不同主题定制为官网,商城,博客等。
wamp安装
下载地址:https://www.wampserver.com/#download-wrapper,也可以去sourceforge下载
https://sourceforge.net/projects/wampserver/files/WampServer%203/
一步步默认安装即可,我的路径安装d:/green/wamp,安装完成后工具栏多了一个图标
如果没有菜单栏点击启动即可
apache默认占用80端口
mysql占用3306端口。
mariadb占用3306端口。
可通过工具栏右键-》tools查看
phpstorm调试环境
下载phpstorm,商业版pj,自行百度
php开启调试
wamp默认已经集成了xdebug相关库。
在wamp对应的php.ini文件中设置开启调试,并制定调试信息链接的dbgp主机ip和端口。
首先访问php的首页,我这里是http://localhost
点击tools中的xdebug_info()
注意看下最下面php.ini位置的,不要自己瞎找,wamp一堆的php.ini,绝对很难找到
我的位置: D:\green\wamp\bin\apache\apache2.4.51\bin\php.ini
step debugger明显是没开启的。点击右侧的计算机表示进入docs,可以找到教程(之前看了网上的教程一堆的remote配置,结果不生效,版本问题,所以需要通过文档去看)
文档如下(说明设置参数xdebug.mode=debug即可)
打开对应的php.ini找到最下面的xdebug
[xdebug]
zend_extension="d:/green/wamp/bin/php/php7.4.26/zend_ext/php_xdebug-3.1.1-7.4-vc15.dll"
;xdebug.mode allowed are : off develop coverage debug gcstats profile trace
xdebug.mode =develop
xdebug.output_dir ="d:/green/wamp/tmp"
xdebug.show_local_vars=0
xdebug.log="d:/green/wamp/logs/xdebug.log"
xdebug.log_level=7
发现他的值是:develop,改成debug,修改了重启下。
可以修改php.ini设置这个ip和端口,我这设置为localhost和9000,最终
[xdebug]
zend_extension="d:/green/wamp/bin/php/php7.4.26/zend_ext/php_xdebug-3.1.1-7.4-vc15.dll"
;xdebug.mode allowed are : off develop coverage debug gcstats profile trace
xdebug.mode =debug
xdebug.output_dir ="d:/green/wamp/tmp"
xdebug.show_local_vars=0
xdebug.log="d:/green/wamp/logs/xdebug.log"
xdebug.log_level=7
xdebug.client_port="9000"
xdebug.client_host="localhost"
诊断消息出现,就修改成功了。
[Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9000 (through xdebug.client_host/xdebug.client_port) :-(
idea配置
在idea中File-Open打开wamp的www目录,打开这个目录的好处是下面的项目,都可以在同一个目录下管理。
点击File-Settings-Languages & Frameworks ->php->debug 设置xdebug的端口
Servers新建一个server的配置(ip和端口设置成wamp中apche入口端口)在调试时需要用
添加一个调试配置
点击ok,点击调试,浏览器自动弹出地址:
http://localhost/wordpress?XDEBUG_SESSION_START=10392(这个id启动一次换一个)
注意如果你在postman中调用这个地址,需要idea断下来就必须带上XDEBUG_SESSION_START=10392这段参数,
如果你想调试其他项目,改个path带上这个参数即可,比如
http://localhost/helloworld/if.php?XDEBUG_SESSION_START=10392
如果出现问题,首先netstat -aon | grep 9000看下端口是否开启(注释idea启动调试才会有这个端口),然后就是查看http://localhost/?xdebuginfo的xdebug是否开启,同时Diagnostic Log是否有错误
php语法入门到精通
php语法参考:https://www.runoob.com/php/php-tutorial.html
变量
<!--在?php快外面是html内容,?php快是后端渲染-->
test
<?php
echo "Hello World!";
echo "<br/>";
# ----------------->1.研究变量定义
###############变量定义
$i=100; //注意变量是$开头,结尾要有;定义在最外部的是全局变量
var_dump($i,"<br/>"); //打印变量的堆栈,类型,变量名,堆栈。
$j=$i>100?"老年":"中年"; //三目表达式
echo $j,"<br/>";
//注意php是弱类型,引用全局变量需要定义一个global变量,名称和全局变量一致
function add($t1,$t2){
global $j,$s; //注意这里$s在外部没有定义,但是也相当于定义了一个全局变量,函数外部就能直接饮用
static $x=101; //注意这里定义了一个静态变量 $x,在外部引用是会报错的,但是他的值在函数结束后不会被删除,当函数被多次调用时他的值会透传到下一次调用中,保持状态
$s=100;
$j=$t1+$t2;
echo "--->",$GLOBALS["j"],"<br/>";//全局变量原理就是定义在$GLOBALS变量中索引就是变量名,也可以赋值$GLOBALS["$j"]=$t1+$t2;
return $GLOBALS["j"];
}
$x=100; //注意这里是定义了一个全局变量 $x 与add的局部变量$x不冲突,也互不影响
echo "静态变量",$x,"<br/>";
echo add(10,2),"<br/>";
print("print函数占位符:{$s}<br/>");
//常量,常量是全局的 php中const和define的区别有:const是语言结构,define是函数;const可以在类中使用,define不可以;const不能在条件分支中使用,define可以。
//常量不能使用$开头
define("CHARSET","utf-8");
const CHASET_GBK="gbk";
echo "常量:",CHARSET,"<br/>";
echo "常量:",CHASET_GBK,"<br/>";
if(CHASET_GBK=="GBK"){
}
//字符串函数 ,参考:runoob.com/php/php-ref-string.html
$str="i_j_s";
echo "字符串长度:",strlen($str),"<br/>";
echo "切割字符串:";var_dump(explode("_",$str));echo "<br/>";
echo "合并数组为字符串:";var_dump(join("_",array("dd","ggg")));echo "<br/>";
echo "找字符串位置:",strpos($str,"_");echo "<br/>"; //注意索引从0开始
###############bool
$isA=true;
###############数组
$cars=array("byd","bmw","bens");
var_dump($cars);echo "<br/>";
echo "打印数组:",$cars[0] .$cars[1].$cars[2],"<br/>"; //可以使用.连接字符串,+号尽量用于数字,不同类型不能使用连接符号,可以使用,隔开
//数组函数,参考:https://www.runoob.com/php/php-ref-array.html
echo "打印数组长度:",count($cars),"<br/>";
//循环打印
for($i=0;$i<count($cars);$i++){
echo $i," ";
}
echo "<br/>";
//定义map,和js类型索引可以是数组也可以是其他类型
$map=array("name"=>"张三","age"=>12);
echo "获取key对应值:",$map["name"],"<br/>";
foreach ($map as $key=>$value){
echo "循环获取key对应值:",$key,"=",$value,"<br/>";
}
###############面向对象
class Car
{
var $color;
//构造函数
function __construct($color = "green")
{
$this->color = $color;
}
function what_color()
{
return $this->color;
}
}
$car=null;
$car=new Car("yellow");
var_dump($car);echo PHP_EOL,"<br/>"; // 换行符:PHP_EOL是\n
?>
ggg
流程
if|switch
<?php
###############流程控制:if
date_default_timezone_set("Asia/Shanghai");
//date_default_timezone_set('UTC');
$date=date("H");
echo "获取小时:",$date,"<br/>";
if($date>=6 && $date<12){
echo "上午","<br/>";
}
elseif($date>=12 && $date<18){
echo "下午","<br/>";
}
//switch
$favcolor="red";
switch ($favcolor)
{
case "red":
echo "你喜欢的颜色是红色!","<br/>";
break;
case "blue":
echo "你喜欢的颜色是蓝色!","<br/>";
break;
case "green":
echo "你喜欢的颜色是绿色!","<br/>";
break;
default:
echo "你喜欢的颜色不是 红, 蓝, 或绿色!","<br/>";
}
循环
<?php
$arr=array("white","yellow","green");
for($i=0;$i<count($arr);$i++){
echo $i,"=>",$arr[$i]," ";
}
echo "<br/>";
foreach ($arr as $key=>$value){
echo "循环获取key对应值:",$key,"=",$value,"<br/>";
}
$i=0;//while循环注意要先初始化变量 否则null无法进入循环
while($i<count($arr))
{
echo $i,"=>",$arr[$i]," ";
$i++;
}
引用
了解下include、include_once、require和require_once这4个函数:
- include函数:会将指定的文件读入并且执行里面的程序;
- require函数:会将目标文件的内容读入,并且把自己本身代换成这些读入的内容;
- include_once 函数:在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次;
- require_once 函数:和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含
include在引入不存文件时产生一个警告且脚本还会继续执行,而require则会导致一个致命性错误且脚本停止执行。
include()与require()的功能相同,但在用法上却有一些不同,include()是有条件包含函数,而 require()则是无条件包含函数。
例如在下面的一个例子中,如果变量$somgthing为真,则将包含文件somefile:
if($something){
include("somefile");
}
但不管$something取何值,下面的代码将把文件somefile包含进文件里:
if($something){
require("somefile");
常用库
<?php
#############日期 https://www.runoob.com/php/php-ref-date.html
date_default_timezone_set("Asia/Shanghai");
echo date("Y/m/d H:i:s") . "<br>";
echo time(). "<br>";
############自定义异常
class CustomException extends Exception
{
public function errorMessage()
{
// 错误信息
$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b>';
return $errorMsg;
}
}
try{
throw new CustomException();
}catch (CustomException $e){
echo $e->errorMessage(),"<br>"; //注意.是连接字符串->才是调用
}
超级变量(http)
<?php
###############$GLOBALS变量
$x = 75;
$y = 25;
function addition()
{
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
################$_SERVER
/*
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。
这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
以下实例中展示了如何使用$_SERVER中的元素: 参考:https://www.runoob.com/php/php-superglobals.html
* */
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo array_key_exists('HTTP_REFERER',$_SERVER)?$_SERVER['HTTP_REFERER']:"";
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'],$_SERVER["REQUEST_URI"];
echo "<br>";
################请求参数
echo "获取参数:",array_key_exists("id",$_REQUEST)?$_REQUEST["id"]:"","<br>";
echo "获取参数:",array_key_exists("id",$_GET)?$_GET["id"]:"","<br>";
echo "获取参数:",array_key_exists("name",$_POST)?$_POST["name"]:"","<br>";
foreach (getallheaders() as $name => $value) {
echo "获取请求头:$name: $value<br/>";
}
//解析json数据,是raw方式body添加个json
$post = @file_get_contents('php://input');
if($post!="") {
$post = json_decode($post, true); //解析成数组
var_export($post);
}
//上传文件,postman 使用form-data上传一个名字为file的文件
//文件相关的参数参考:https://www.runoob.com/php/php-ref-filesystem.html
if(array_key_exists("file",$_FILES)){
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
$uploadDir="d:/upload/";
//创建上传目录
if(!file_exists($uploadDir)){
mkdir($uploadDir);
}
if (file_exists( $uploadDir. $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], $uploadDir . $_FILES["file"]["name"]);
echo "文件存储在: " . $uploadDir . $_FILES["file"]["name"];
}
}
namespace
新建namespace.php
<?php
namespace a\b{
$name="zs"; //注意这是全局变量在任何namespace都可以用
const i=100;
function print1(){
echo i;
}
class A{
public function __construct()
{
}
}
}
namespace a\c{
const i=200;
function print1(){
global $name;
echo i,$name;
}
class A{
public function __construct()
{
}
}
}
namespace {
//导入其他php文件
include 'namespacelib.php';
function print1(){
echo 500;
}
echo print1(),"<br/>";
echo a\b\print1(),"<br/>";
echo a\c\print1(),"<br/>";
echo var_dump(new a\c\A()),"<br/>";
echo var_dump(new a\b\A()),"<br/>";
echo var_dump(new a\d\A("zs")),"<br/>";
a\d\A::staticmethod();
}
新建namespacelib.php
<?php
namespace a\d{
class A{
var $name=null;
public function __construct($name)
{
$this->$name=$name;
}
static function staticmethod() {
}
}
}
mysql数据库
<?php
$servername = "localhost";
$username = "root";
$password = "";
$database = "information_schema";
// 检测连接// 创建连接
$conn = mysqli_connect($servername, $username, $password,$database);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功<br/>";
$sql="SELECT * FROM ENGINES";
$result=$conn->query($sql);
if($result->num_rows>0){
while($row=$result->fetch_assoc()){
printf("%s (%s)\n<br/>", $row["ENGINE"], $row["COMMENT"]);
}
}
mysqli_select_db($conn,"jieztech"); //切换到另外一个数据库
$result=$conn->query("drop table if exists a;");//删除表
if(! $result )
{
die('数据表创建失败: ' . mysqli_error($conn));
}
$result=$conn->query("create table a(id int);"); //创建表
if($conn->query("insert into a(id) values(1)")){ //插入数据
echo "插入数据成功<br/>";
}
//mysqli_close($conn);
$conn->close();
?>
wordpress安装
wordpress包安装
创建数据库
首先需要在mysql中创建一个库,打开首页http://localhost点击php http://localhost/phpmyadmin/
选择mysql,输入root,密码空进入。
输入你想要的名字,选择字符集utf8_bin
wordpress安装
下载并提取WordPress,将文件解压到www目录下,目录结构:
运行http://localhost/wordpress 一步步安装,选择简体中文(下面几张图copy其他站点的,安装忘记截图了)
,选择你的数据库名称,账号和密码,
在接下来的步骤中,输入您的站点标题,用户名,密码和其余所需数据。您应该取消选中“建议搜索引擎不索引本站点”按钮(因为我们不希望搜索引擎在开发阶段或实验阶段将我们的网站编入索引),然后单击“安装WordPress”
访问http://localhost/wordpress/wp-admin 输入你设置的用户名和密码登录
duplicator备份还原
比如你的站点在线上,如果希望备份下来安装到你的wamp中,可以在线上的wordpress安装duplicator插件。
将下载安装php和备份包两个文件拷贝到www/wordpress目录下,然后访问
http://localhost/wordpress/installer.php,还原完成即可访问。