温馨提示×

ubuntu php为何连不上网

小樊
39
2026-09-19 13:01:49
栏目: 编程语言

在 Ubuntu 上 PHP 连不上网(比如 file_get_contentscurlfsockopen 失败)通常不是 PHP 本身的问题,而是系统网络、权限或 PHP 配置导致的。下面按常见原因逐一排查。


一、先确认是不是“系统本身不能上网”

在终端执行:

ping -c 3 8.8.8.8
ping -c 3 www.baidu.com
curl https://www.baidu.com
  • 都不通 → 是 Ubuntu 网络问题(DNS / 防火墙 / 代理)
  • curl 通,PHP 不通 → 是 PHP 或运行环境的问题

二、PHP 运行方式不同,网络权限不同(非常重要)

1. PHP CLI(命令行)

php test.php

✅ 一般直接用系统网络
❌ 如果你用了 sudo 或不同用户,可能路由/DNS 不同


2. PHP-FPM + Nginx / Apache(Web 环境)

PHP 是以 www-data 用户运行的:

ps aux | grep php-fpm

常见问题:

  • www-data防火墙限制
  • www-data 没有 DNS 权限
  • 使用了 代理但未配置

三、最常见原因汇总

✅ 1. 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)


✅ 2. PHP 的 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

✅ 3. curl 扩展没装

var_dump(function_exists('curl_init'));

如果没有:

sudo apt install php-curl
sudo systemctl restart apache2 / php-fpm

✅ 4. 防火墙 / SELinux / AppArmor

Ubuntu 默认:

  • UFW
  • AppArmor(可能限制 php-fpm)

查看:

sudo ufw status

临时测试:

sudo ufw disable

✅ 5. 服务器在代理 / 内网环境

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');

✅ 6. IPv6 问题(很隐蔽)

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 脚本

<?php
$url = "https://www.baidu.com";
$res = @file_get_contents($url);
var_dump($res);
echo error_get_last()['message'] ?? 'ok';

五、如果你愿意,我可以直接帮你定位

你可以补充:

  1. Ubuntu 版本
  2. PHP 版本
  3. 运行方式(CLI / Nginx / Apache)
  4. 具体报错信息(完整)

我可以直接告诉你是哪一步导致的连不上网

0