在 Ubuntu 上 PHP 连不上网(比如 file_get_contents、curl、fsockopen 失败)通常不是 PHP 本身的问题,而是系统网络、权限或 PHP 配置导致的。下面按常见原因逐一排查。
在终端执行:
ping -c 3 8.8.8.8
ping -c 3 www.baidu.com
curl https://www.baidu.com
php test.php
✅ 一般直接用系统网络
❌ 如果你用了 sudo 或不同用户,可能路由/DNS 不同
PHP 是以 www-data 用户运行的:
ps aux | grep php-fpm
常见问题:
www-data 被 防火墙限制www-data 没有 DNS 权限PHP 报错类似:
failed to open stream: php_network_getaddresses: getaddrinfo failed
解决:
cat /etc/resolv.conf
应有:
nameserver 8.8.8.8
nameserver 114.114.114.114
没有就加:
sudo nano /etc/resolv.conf
(如果是 DHCP,改 Netplan 或 NetworkManager)
allow_url_fopen 关闭var_dump(ini_get('allow_url_fopen'));
如果是 Off:
sudo nano /etc/php/*/cli/php.ini
sudo nano /etc/php/*/fpm/php.ini
改为:
allow_url_fopen = On
重启:
sudo systemctl restart php-fpm
var_dump(function_exists('curl_init'));
如果没有:
sudo apt install php-curl
sudo systemctl restart apache2 / php-fpm
Ubuntu 默认:
查看:
sudo ufw status
临时测试:
sudo ufw disable
PHP 必须显式设置代理:
$context = stream_context_create([
'http' => [
'proxy' => 'http://127.0.0.1:7890',
'request_fulluri' => true
]
]);
或 curl:
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:7890');
PHP 有时优先 IPv6 但网络不支持。
测试:
fsockopen('www.baidu.com', 80);
解决:
; php.ini
curl.cainfo = /etc/ssl/certs/ca-certificates.crt
或强制 IPv4:
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
<?php
$url = "https://www.baidu.com";
$res = @file_get_contents($url);
var_dump($res);
echo error_get_last()['message'] ?? 'ok';
你可以补充:
我可以直接告诉你是哪一步导致的连不上网。