在PHP项目中实现SkyWalking(现已成为Apache顶级项目)通常有两种主流方式:

使用SkyWalking PHP Agent(推荐)
安装步骤
安装C扩展
# 下载编译好的扩展(以Linux为例) wget https://github.com/SkyAPM/SkyAPM-php-sdk/releases/download/v4.3.0/skywalking_agent-4.3.0-php7.4.so # 放入PHP扩展目录 cp skywalking_agent-4.3.0-php7.4.so /usr/lib/php/20190902/ # 修改php.ini extension=skywalking_agent.so # 配置Agent skywalking.agent.application_code=my_php_app skywalking.agent.server_addr=127.0.0.1:11800 skywalking.agent.sample_n_per_3_secs=-1 # 全部采样 skywalking.agent.log_path=/tmp/skywalking
重启PHP服务
systemctl restart php-fpm # 或 service php7.4-fpm restart
验证安装
// 检查扩展是否加载 php -m | grep skywalking // 查看配置 php -i | grep skywalking
使用SkyAPM SDK手动埋点(推荐生产环境)
安装Composer依赖
composer require skyapm/skyapm
手动埋点示例
<?php
require_once 'vendor/autoload.php';
use SkyAPM\Agent;
use SkyAPM\Span;
use SkyAPM\Tracing;
// 初始化Agent
$agent = Agent::singleton();
$agent->config([
'app_code' => 'my_php_app',
'server_addr' => '127.0.0.1:11800',
'sample_n_per_3_secs' => -1,
]);
// 创建入口Span(类似分布式追踪的根节点)
$entrySpan = new Span();
$entrySpan->start('web', 'POST /api/users');
$entrySpan->setOperationName('UserController@store');
try {
// 创建子Span(数据库查询)
$dbSpan = new Span();
$dbSpan->start('db', 'MongoDB');
$dbSpan->setOperationName('users.insert');
// 执行数据库操作
$result = $db->users->insertOne($userData);
$dbSpan->end(); // 结束数据库Span
// 调用外部服务
$httpSpan = new Span();
$httpSpan->start('http', 'curl');
$httpSpan->setOperationName('GET /api/notify');
$ch = curl_init('http://internal-api/notify');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$httpSpan->end(); // 结束HTTP Span
} catch (\Exception $e) {
$entrySpan->log(['event' => 'error', 'message' => $e->getMessage()]);
$entrySpan->setError();
}
$entrySpan->end(); // 结束入口Span
框架集成(Laravel为例)
安装Laravel适配器
composer require skyapm/laravel-skyapm
发布配置文件
php artisan vendor:publish --provider="SkyAPM\Laravel\ServiceProvider"
配置.env
SKYWALKING_APP_CODE=laravel_app SKYWALKING_SERVER_ADDR=127.0.0.1:11800 SKYWALKING_SAMPLE_N_PER_3_SECS=-1
自动注入中间件
在 app/Http/Kernel.php 中添加:
protected $middleware = [
\SkyAPM\Laravel\Middleware::class,
// ... 其他中间件
];
配置SkyWalking OAP后端
Docker部署OAP
# docker-compose.yml
version: '3'
services:
skywalking-oap:
image: apache/skywalking-oap-server:8.5.0
ports:
- "11800:11800" # gRPC端口
- "12800:12800" # HTTP端口
environment:
SW_STORAGE: elasticsearch
SW_ES_USER: elastic
SW_ES_PASSWORD: changeme
skywalking-ui:
image: apache/skywalking-ui:8.5.0
ports:
- "8080:8080"
depends_on:
- skywalking-oap
配置PHP-FPM集成(关键)
Nginx配置
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
# 传递Trace上下文(必须)
fastcgi_param HTTP_SW8 $http_sw8;
fastcgi_param HTTP_SW8_CORRELATION $http_sw8_correlation;
}
Apache配置
<VirtualHost *:80>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
# 传递Trace header
RequestHeader set SW8 "%{HTTP_SW8}e"
RequestHeader set SW8-CORRELATION "%{HTTP_SW8_CORRELATION}e"
</VirtualHost>
最佳实践
上下文传播
// 跨进程传递Trace上下文 $headers = []; $agent->inject($headers); // 注入到HTTP头 // 接收端提取 $agent->extract(getallheaders()); // 从HTTP头提取
性能采样控制
// 控制采样率(0-10000)
$agent->config([
'sample_n_per_3_secs' => 100, // 每3秒采样100个请求
'ignore_paths' => ['/healthz', '/metrics'], // 忽略健康检查端点
]);
日志集成(可选)
// 添加自定义日志标签
$span->addTag('user_id', $userId);
$span->addLog(['event' => 'cache_hit', 'key' => $cacheKey]);
监控验证
- 查看Agent日志:
/tmp/skywalking/skywalking_agent.log - OAP Dashboard:
http://localhost:8080 - 命令行验证:
# 发送测试请求 curl http://your-php-app/api/health
查看OAP日志
docker logs skywalking-oap --tail 50
## 8. 常见问题解决
### 问题1:Span未正常关闭
```php
// 确保所有Span都正确关闭
try {
$span->start();
// ... 业务代码
$span->end(); // 在finally块中保证执行
} finally {
if ($span->isRunning()) {
$span->end();
}
}
问题2:版本不兼容
# 检查PHP版本和扩展版本
php -v # 需要>=7.2
skywalking_agent.so版本需要与OAP版本匹配
问题3:数据不显示
# 检查防火墙规则
telnet 127.0.0.1 11800 # 确认gRPC端口可达
# 查看OAP日志配置
vim /skywalking/config/application.yml
- 快速接入:使用C扩展(注意PHP版本兼容性)
- 生产环境:使用Composer包 + 手动埋点(更灵活控制)
- 框架集成:优先使用框架适配器(如Laravel、Symfony)
- 性能要求高:仅关键业务手动埋点,关闭全量采样
建议先在测试环境验证,确认Trace数据能够正常传输到SkyWalking OAP,再逐步接入生产环境。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播