核心关键词:PHP 获取以太坊数据、以太坊节点 API、以太坊 JSON-RPC、Web3.php 示例、以太坊区块链浏览器 API、以太坊数据提供商、PHP 调用智能合约
以太坊每天都有数千万笔交易、百万级地址活跃,开发者最想解决的正是 “用 PHP 到底怎么快速、稳定地拿到链上数据?” 本文将从零拆解 5 条主流路线,给出可直接落地的代码片段、避坑清单和常见问答,一条就够你上线生产。
目录
- 本地节点 JSON-RPC:最原生的解决方案
- 第三方节点 API:Infura & Alchemy 半小时接入
- 区块链浏览器 API:无需同步区块即可查历史
- 直接调用智能合约:PHP 也能读函数返回值
- 数据聚合商 API:一站式拿统计类数据
- 常见问题 FAQ
- 延伸阅读与下一步
1. 本地节点 JSON-RPC:最原生的解决方案
运行节点
先用 Geth 启动一条主网节点(测试网同理):
geth --http --http.api eth,net,web3 --http.port 8545 --http.corsdomain "*"等待区块同步完毕,curl 校验:
curl -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'PHP 调用示例(Guzzle 库)
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'http://localhost:8545']);
$response = $client->post('', [
'json' => [
'jsonrpc' => '2.0',
'method' => 'eth_getBlockByNumber',
'params' => ['latest', true],
'id' => 1
]
]);
$data = json_decode($response->getBody(), true);
print_r($data['result']); // 最新区块信息场景总结:节点在手、延迟最低,但需要 1 T+ 固态、稳定网络维护。
2. 第三方节点 API:Infura & Alchemy 半小时接入
| 优点 | 备注 |
|---|---|
| 零运维 | 无需同步区块 |
| 免费额度 | 每天十万次调用 |
| WebSocket 推送 | 订阅事件推送 |
申请
- 注册后新建 Project → 拿到 RPC Endpoint:
https://mainnet.infura.io/v3/YOUR_PROJECT_ID - HTTPS 头带
Content-Type: application/json
PHP cURL 速查牌
$data = [
'jsonrpc' => '2.0',
'method' => 'eth_getBalance',
'params' => ['0x742d35Cc6634C0532925a3b844Bc454e4438f44e', 'latest'],
'id' => 1
];
$ch = curl_init('https://mainnet.infura.io/v3/YOUR_PROJECT_ID');
curl_setopt_array($ch, [
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_RETURNTRANSFER => 1
]);
$result = json_decode(curl_exec($ch), true);
echo hexdec($result['result']); // 余额(wei)👉 想零成本体验 10 万条 / 天的节点速率?一分钟申请立刻体验!
3. 区块链浏览器 API:无需同步区块即可查历史
| 来源 | 接口路径示例 |
|---|---|
| Etherscan | https://api.etherscan.io/api?module=account&action=txlist&address=0x... |
| OKLink | https://www.oklink.com/api/v5/explorer/address/balance |
Etherscan PHP 速用
$addr = '0x...';
$key = 'YOUR_API_KEY';
$url = "https://api.etherscan.io/api?module=account&action=txlist&address=$addr&startblock=0&endblock=99999999&sort=asc&apikey=$key";
$json = json_decode(file_get_contents($url), true);
print_r($json['result']); // 最近 1000 笔转账注意:免费账号每秒 5 次限制;大额调频建议上缓存队列。
4. 直接调用智能合约:PHP 也能读函数返回值
若你的 DApp 将业务数据写进合约映射,只需 直接读取。
Web3.php 安装
composer require web3p/web3.php读 balanceOf 示例
use Web3\Web3;
use Web3\Contract;
$web3 = new Web3('https://mainnet.infura.io/v3/YOUR_PROJECT_ID');
$abi = json_decode(file_get_contents('erc20.json'), true);
$contract = new Contract($web3->provider, $abi);
$contractAddress = '0xA0b...'; // USDT
$userAddress = '0x742...';
$balance = null;
$contract->at($contractAddress)->call('balanceOf', $userAddress, function($err, $res) use (&$balance) {
if ($err !== null) return;
$balance = $res[0]->toString();
});
echo "Balance: " . bcdiv($balance, pow(10, 6), 6); // USDT 6位小数👉 一键查看 USDT 转账、Gwei 实时费用、历史回执,全部接口跨队列支持!
5. 数据聚合商 API:一站式拿统计类数据
项目要做大盘指标、链上画像,自建成本极高,直接订阅数据商最划算:
- Dune API(SQL 结果导出)
- BitQuery GraphQL(实时索引)
- Tokenview 聚合(地址标签、节点状态)
示例:BitQuery 查询近七天某地址的流入总量
query($addr: String!) {
ethereum(network: ethereum) {
inbound: transfers(
receiver: {is: $addr}
date: {since: "2025-06-12"}
) {
amount
}
}
}PHP 侧用 gmostofeo/guzzle-http-graphql 发送即可。
6. 常见问题 FAQ
Q1:PHP 能否监听实时事件(New Block、Transfer Log)?
A:用 nodes 的 WebSocket 协议+eth_subscribe,PHP 可采用 react/socket 组件保持长连接,实现毫秒级推送。
Q2:免费节点有频率限制,如何扩容?
A: 部署二级缓存:把高频查询结果落地到 Redis 或 MySQL 实现 1 秒级 TTL;超出节点 QPS 时再读缓存。
Q3:怎样避免重复请求同一个区块?
A:做 区块高度对照表;节点返回的 number 在缓存命中则直接跳过。
Q4:智能合约返回的十六进制怎么转可读数字?
A:PHP 可用 bchexdec(自定义函数)或 phpseclib 核心函数直接解析。
Q5:合约函数有 view/pure 还需要签交易吗?
A:纯读操作无需签名,offline call 不消耗 gas,依然须连接节点。
Q6:正式环境如何防 API Key 泄漏?
A:放到 环境变量,CI/CD 用 Vault/Secrets Manager 注入,代码仓库绝不留密文。
7. 延伸阅读与下一步
- 官方文档:ethereum.org JSON-RPC 规范
- 进阶:用 Go 写高性能链上解析器,HTTP → gRPC 提速
- 风控:交易回执日志解析与黑名单地址实时拦截
一句话总结:先选“节点可靠性”,再谈“接口封装”。把上面 5 条路跑通,你就拥有了 全天候读链 + 实时风控 + 可视化大盘 的底层能力。祝你开发顺利!