php icon indicating copy to clipboard operation
php copied to clipboard

Problem with `curl` for PHP runtime

Open decryptable opened this issue 6 months ago β€’ 1 comments

Bug report

  • Vercel CLI Version: 39.0.4
  • NodeJS Version: 18.x
  • vercel-php: 0.7.3
  • URL: https://pln-api.vercel.app
  • PHP info: https://pln-api.vercel.app/debug
  • Repository: No

Description

At the beginning of the deployment, using curl had no problems at all. But 1 day later, the API suddenly responded to an error with a message: β€œCall to undefined function curl_init()”. I tried several solutions in the problem report history of this repository with the same problem, but all of them did not work at all.

I tried the following:

  1. Changing the NodeJS version to 18.x, 20.x, 22.x
  2. Changed the version of vercel-php in vercel.json with several versions: 0.7.3, 0.6.2
  3. Changed the use of curl_* to file_get_contents with stream_context_create customization using the same flow

From all the experiments above, the API now does not provide any response, only a blank page with HTTP 200 status code. Actually this is a simple project to create a RESTFull API by calling the API from another server, then returning the response back to the client. Here are some code on my project:

Image

project-structure
β”œβ”€ api
β”‚  β”œβ”€ debug.php
β”‚  └─ handler.php
β”œβ”€ index.min.html
β”œβ”€ openapi.min.json
└─ vercel.json

vercel.json :

{
  "functions": {
    "api/**/*.php": {
      "runtime": "[email protected]"
    }
  },
  "routes": [
    { "src": "/", "dest": "/index.min.html" },
    { "src": "/oas", "dest": "/api/handler.php" },
    { "src": "/debug", "dest": "/api/debug.php" },
    { "src": "/api/(.*)", "dest": "/api/handler.php" }
  ]
}

api/debug.php :

<?php phpinfo();

api/handler.php:

<?php
// error_reporting(0);

// ...some code

try {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $body = file_get_contents('php://input');

    if (
        $method === 'GET' &&
        !empty($operation['requestBody']) &&
        empty($body)
    ) {

        $body = json_encode($_GET);
    }


    curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $forwardedHeaders);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);


    $contentType = 'text/plain';
    try {
        json_decode($response, false, 512, JSON_THROW_ON_ERROR);
        $contentType = 'application/json';
    } catch (JsonException $e) {
        $contentType = 'text/plain';
    }

    http_response_code($httpCode);
    header("Content-Type: $contentType");
    echo $response;
} catch (\Throwable $th) {
    echo json_encode([
        "code" => "500",
        "message" => "There is a gateway server error, please try again in a while.",
        "data" => $th->getMessage()
    ]);
}

decryptable avatar Jun 08 '25 23:06 decryptable

Hi, thank you for report, I will take a look.

f3l1x avatar Jun 09 '25 06:06 f3l1x

same. a blank page with HTTP 200 status code.

qkqpttgf avatar Jul 10 '25 01:07 qkqpttgf

i would say its a duplication of #582

nadar avatar Jul 16 '25 20:07 nadar

Hi @decryptable and others. Please take a look at https://github.com/vercel-community/php/issues/582#issuecomment-3085337464

f3l1x avatar Jul 18 '25 05:07 f3l1x

@f3l1x I am sorry, but, 18/20/22 all blank page now.

qkqpttgf avatar Jul 28 '25 02:07 qkqpttgf

What do you mean? I have deployed many services and examples and they are OK. I need more info.

f3l1x avatar Jul 28 '25 06:07 f3l1x

@f3l1x sorry for the late reply. after doing some experiments, I have another conclusion to the problem I am facing.

the third-party API server seems to reject API calls from certain country IPs, and only allow IP requests from servers with certain country providers.

In my case, this might be the main problem. Because after I tried to create an API server with another programming language with the same flow β€”like in the previous PHP code, this problem still occurred.

In conclusion, the API server that I called in fact always refused to provide a response if it was called from an IP that was not from a certain country.

Can I close this issue?

decryptable avatar Jul 28 '25 21:07 decryptable

What do you mean? I have deployed many services and examples and they are OK. I need more info.

my project url: https://github.com/qkqpttgf/OneManager-php , deploy to vercel use: https://scfonedrive.github.io/Vercel/Deploy.html , they works well for years. but now, it is a blank page after deploy, nothing changed .

qkqpttgf avatar Jul 29 '25 01:07 qkqpttgf

@qkqpttgf This https://scfonedrive.github.io/Vercel/Deploy.html is some custom deployment? Do you have any vercel.json example for https://github.com/qkqpttgf/OneManager-php?

f3l1x avatar Jul 29 '25 06:07 f3l1x

@qkqpttgf This https://scfonedrive.github.io/Vercel/Deploy.html is some custom deployment? Do you have any vercel.json example for https://github.com/qkqpttgf/OneManager-php?

sorry, out for work 2 days.

these 2 page written by me, and vercel.json is line 410 and 701 in Deploy.html, after deploy, in vercel it like this:

Image

qkqpttgf avatar Aug 01 '25 01:08 qkqpttgf