Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
study
提交
b726a75d
S
study
项目概览
OpenDocCN
/
study
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
study
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b726a75d
编写于
5月 30, 2019
作者:
C
codinghuang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update: update the README
上级
019d56f2
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
294 addition
and
1 deletion
+294
-1
README.md
README.md
+3
-1
docs/《PHP扩展开发》-协程-编写config-m4文件.md
docs/《PHP扩展开发》-协程-编写config-m4文件.md
+271
-0
docs/《PHP扩展开发》-协程-规范.md
docs/《PHP扩展开发》-协程-规范.md
+20
-0
未找到文件。
README.md
浏览文件 @
b726a75d
...
@@ -2,5 +2,7 @@
...
@@ -2,5 +2,7 @@
## 《PHP扩展开发》--协程
## 《PHP扩展开发》--协程
[
1、编写config.m4文件
](
https://zhuanlan.zhihu.com/p/67517415
)
[
1、编写config.m4文件
](
./docs/《PHP扩展开发》-协程-编写config-m4文件
)
[
2、开发规范
](
./docs/《PHP扩展开发》-协程-规范
)
docs/《PHP扩展开发》-协程-编写config-m4文件.md
0 → 100644
浏览文件 @
b726a75d
---
title
:
《PHP扩展开发》--协程(编写config.m4文件)
date
:
2019-05-30 13:51:26
tags
:
-
PHP
-
PHP扩展
-
Swoole
---
[
仓库地址
](
https://github.com/php-extension-research/study
)
这是一个系列的文章,会逐步带大家去实现一个
`PHP`
协程扩展。我们把这个扩展叫做
`study`
。
首先,我们需要去生成扩展的基本目录。我们可以在
`PHP`
的源码里面找到一个工具叫做
`ext_skel`
。它可以帮我们生成扩展目录。这里不进行介绍。
生成扩展目录后,我们需要去复制一份
`Swoole`
扩展目录下的
`thirdparty/boost`
。因为我们写上下文切换的时候,会用到这些库:
```
shell
~/codeDir/cppCode/study
# tree
.
├── CREDITS
├── EXPERIMENTAL
├── config.m4
├── include
├── make.sh
├── php_study.h
├── study.c
├── study.php
├── tests
│ └── 001.phpt
└── thirdparty
└── boost
└── asm
├── jump_arm64_aapcs_elf_gas.S
├── jump_arm64_aapcs_macho_gas.S
├── jump_arm_aapcs_elf_gas.S
├── jump_arm_aapcs_macho_gas.S
├── jump_arm_aapcs_pe_armasm.asm
├── jump_combined_sysv_macho_gas.S
├── jump_i386_ms_pe_gas.asm
├── jump_i386_ms_pe_masm.asm
├── jump_i386_sysv_elf_gas.S
// 省略了其他的文件
```
然后,我们打开
`config.m4`
文件,进行编写:
```
shell
PHP_ARG_ENABLE
(
study, whether to
enable
study support,
Make sure that the comment is aligned:
[
--enable-study
Enable study support]
)
# AC_CANONICAL_HOST
if
test
"
$PHP_STUDY
"
!=
"no"
;
then
PHP_ADD_LIBRARY
(
pthread
)
STUDY_ASM_DIR
=
"thirdparty/boost/asm/"
CFLAGS
=
"-Wall -pthread
$CFLAGS
"
AS_CASE
([
$host_os
]
,
[
linux
*
]
,
[
STUDY_OS
=
"LINUX"
]
,
[]
)
AS_CASE
([
$host_cpu
]
,
[
x86_64
*
]
,
[
STUDY_CPU
=
"x86_64"
]
,
[
x86
*
]
,
[
STUDY_CPU
=
"x86"
]
,
[
i?86
*
]
,
[
STUDY_CPU
=
"x86"
]
,
[
arm
*
]
,
[
STUDY_CPU
=
"arm"
]
,
[
aarch64
*
]
,
[
STUDY_CPU
=
"arm64"
]
,
[
arm64
*
]
,
[
STUDY_CPU
=
"arm64"
]
,
[]
)
if
test
"
$STUDY_CPU
"
=
"x86_64"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"x86_64_sysv_elf_gas.S"
fi
elif
test
"
$STUDY_CPU
"
=
"x86"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"i386_sysv_elf_gas.S"
fi
elif
test
"
$STUDY_CPU
"
=
"arm"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"arm_aapcs_elf_gas.S"
fi
elif
test
"
$STUDY_CPU
"
=
"arm64"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"arm64_aapcs_elf_gas.S"
fi
elif
test
"
$STUDY_CPU
"
=
"mips32"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"mips32_o32_elf_gas.S"
fi
fi
study_source_file
=
"
\
study.c
\
${
STUDY_ASM_DIR
}
make_
${
STUDY_CONTEXT_ASM_FILE
}
\
${
STUDY_ASM_DIR
}
jump_
${
STUDY_CONTEXT_ASM_FILE
}
"
PHP_NEW_EXTENSION
(
study,
$study_source_file
,
$ext_shared
, ,, cxx
)
PHP_ADD_INCLUDE
([
$ext_srcdir
])
PHP_ADD_INCLUDE
([
$ext_srcdir
/include]
)
PHP_INSTALL_HEADERS
([
ext/study],
[
*
.h config.h include/
*
.h thirdparty/
*
.h]
)
PHP_REQUIRE_CXX
()
CXXFLAGS
=
"
$CXXFLAGS
-Wall -Wno-unused-function -Wno-deprecated -Wno-deprecated-declarations"
CXXFLAGS
=
"
$CXXFLAGS
-std=c++11"
PHP_ADD_BUILD_DIR
(
$ext_builddir
/thirdparty/boost
)
PHP_ADD_BUILD_DIR
(
$ext_builddir
/thirdparty/boost/asm
)
fi
```
内容很长,我们慢慢来看:
```
shell
AS_CASE
([
$host_os
]
,
[
linux
*
]
,
[
STUDY_OS
=
"LINUX"
]
,
[]
)
```
这段是用来判断我们机器所使用的操作系统是什么类型的,然后把操作系统的类型赋值给变量
`STUDY_OS`
。因为,我们的这个扩展只打算支持
`Linux`
,所以,我这个里面只写了
`Linux`
。
```
shell
AS_CASE
([
$host_cpu
]
,
[
x86_64
*
]
,
[
STUDY_CPU
=
"x86_64"
]
,
[
x86
*
]
,
[
STUDY_CPU
=
"x86"
]
,
[
i?86
*
]
,
[
STUDY_CPU
=
"x86"
]
,
[
arm
*
]
,
[
STUDY_CPU
=
"arm"
]
,
[
aarch64
*
]
,
[
STUDY_CPU
=
"arm64"
]
,
[
arm64
*
]
,
[
STUDY_CPU
=
"arm64"
]
,
[]
)
```
类似的,这段是判断
`CPU`
的类型,然后赋值给变量
`STUDY_CPU`
。
```
shell
if
test
"
$STUDY_CPU
"
=
"x86_64"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"x86_64_sysv_elf_gas.S"
fi
elif
test
"
$STUDY_CPU
"
=
"x86"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"i386_sysv_elf_gas.S"
fi
elif
test
"
$STUDY_CPU
"
=
"arm"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"arm_aapcs_elf_gas.S"
fi
elif
test
"
$STUDY_CPU
"
=
"arm64"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"arm64_aapcs_elf_gas.S"
fi
elif
test
"
$STUDY_CPU
"
=
"mips32"
;
then
if
test
"
$STUDY_OS
"
=
"LINUX"
;
then
STUDY_CONTEXT_ASM_FILE
=
"mips32_o32_elf_gas.S"
fi
fi
```
这段是判断应该用什么类型的汇编文件,然后赋值给变量
`STUDY_CONTEXT_ASM_FILE`
。
```
shell
study_source_file
=
"
\
study.c
\
${
STUDY_ASM_DIR
}
make_
${
STUDY_CONTEXT_ASM_FILE
}
\
${
STUDY_ASM_DIR
}
jump_
${
STUDY_CONTEXT_ASM_FILE
}
"
```
这段是把我们需要编译的所有文件已字符串的方式存入到变量
`study_source_file`
里面。
```
shell
PHP_NEW_EXTENSION
(
study,
$study_source_file
,
$ext_shared
, ,, cxx
)
```
这段是声明这个扩展的名称、需要的源文件名、此扩展的编译形式。其中
`$ext_shared`
代表此扩展是动态库,使用
`cxx`
的原因是,我们的这个扩展使用
`C++`
来编写。
```
shell
PHP_ADD_INCLUDE
([
$ext_srcdir
])
PHP_ADD_INCLUDE
([
$ext_srcdir
/include]
)
```
这段是用来添加额外的包含头文件的目录。
```
shell
PHP_INSTALL_HEADERS
([
ext/study],
[
*
.h config.h include/
*
.h thirdparty/
*
.h]
)
```
这段是把我们的
`study`
扩展目录里面的
`*.h`
、
`config.h`
、
`include/*.h`
、
`thirdparty/*.h`
复制到:
```
shell
php-config
--include-dir
```
下的
`ext/study`
里面。这个是在执行
`make install`
的时候会进行复制。我们待会会看到。
```
shell
PHP_REQUIRE_CXX
()
```
因为,我们使用了
`C++`
,所以我们需要指明一下。(没有这句会编译出错)
```
shell
CXXFLAGS
=
"
$CXXFLAGS
-Wall -Wno-unused-function -Wno-deprecated -Wno-deprecated-declarations"
CXXFLAGS
=
"
$CXXFLAGS
-std=c++11"
```
这段是指定编译
`C++`
时候,用到的编译选项。
```
shell
PHP_ADD_BUILD_DIR
(
$ext_builddir
/thirdparty/boost
)
PHP_ADD_BUILD_DIR
(
$ext_builddir
/thirdparty/boost/asm
)
```
这段是指定这个扩展需要被编译到的文件的目录。因为我们需要编译
`boost`
提供的代码,所以需要进行指定。
编写完之后,我们就可以进行编译了:
```
shell
~/codeDir/cppCode/study
# ./make.sh
```
(如果无法执行
`make.sh`
脚本,需要设置它为可执行)
然后,会看到以下输出:
```shell
----------------------------------------------------------------------
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20180731/
Installing header files: /usr/local/include/php/
~/codeDir/cppCode/study #
```
代表编译成功了。`study.so`扩展被存放在了:
```
shell
/usr/local/lib/php/extensions/no-debug-non-zts-20180731/
```
里面。
OK,我们现在来看看我们扩展的头文件是否被复制了:
```
shell
~/codeDir/cppCode/study # ls /usr/local/include/php/ext/study/
config.h include php_study.h thirdparty
~/codeDir/cppCode/study #
```
(本文结束)
docs/《PHP扩展开发》-协程-规范.md
0 → 100644
浏览文件 @
b726a75d
---
title
:
《PHP扩展开发》--协程(规范)
date
:
2019-05-30 18:43:34
tags
:
-
PHP
-
PHP扩展
-
Swoole
---
在开始开发之前,很有必要先说一下开发的规范问题。
1、我们的
`PHP`
扩展函数的声明都放在文件
`php_study.h`
里面。例如:
```
c++
PHP_FUNCTION
(
test
);
```
2、只在项目根目录下的
`study_*.cc`
文件里面使用
`Zend API`
,不在
`src`
目录的代码里面使用
`Zend API`
。
(待补充)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录