5种主流方式:如何使用PHP获取以太坊数据(完整实战指南)

·

核心关键词:PHP 获取以太坊数据、以太坊节点 API、以太坊 JSON-RPC、Web3.php 示例、以太坊区块链浏览器 API、以太坊数据提供商、PHP 调用智能合约

以太坊每天都有数千万笔交易、百万级地址活跃,开发者最想解决的正是 “用 PHP 到底怎么快速、稳定地拿到链上数据?” 本文将从零拆解 5 条主流路线,给出可直接落地的代码片段、避坑清单和常见问答,一条就够你上线生产。


目录


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 推送订阅事件推送

申请

  1. 注册后新建 Project → 拿到 RPC Endpointhttps://mainnet.infura.io/v3/YOUR_PROJECT_ID
  2. 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:无需同步区块即可查历史

来源接口路径示例
Etherscanhttps://api.etherscan.io/api?module=account&action=txlist&address=0x...
OKLinkhttps://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:一站式拿统计类数据

项目要做大盘指标、链上画像,自建成本极高,直接订阅数据商最划算:

示例: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: 部署二级缓存:把高频查询结果落地到 RedisMySQL 实现 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. 延伸阅读与下一步

一句话总结:先选“节点可靠性”,再谈“接口封装”。把上面 5 条路跑通,你就拥有了 全天候读链 + 实时风控 + 可视化大盘 的底层能力。祝你开发顺利!