在密集的curl操作之后,PHP变量将还原为最后分配的变量

时间:2018-10-31 12:35:41

标签: memory

我正在查询一种api并将数据发送到另一种。我也在查询mysql数据库。一秒钟内完成所有大约40次操作。然后等待一分钟,然后重复。我有一种PHP可以做的极限。

我的问题是关于两个变量,它们将从前一个循环中随机返回到其最后一个值。它们仅在调用self :: apiCall()之后更改其值(在第二个函数下方)。 $ product和$ productId都会随机更改其值,大约每40个循环更改一次。

我将PHP提升到7.2,将内存增加到512,并将一些变量分配为null以节省内存。我没有收到任何官方的内存警告,但是看着变量随机返回其最后一个值令人困惑。这是代码的样子。

/**
* The initial create products loop which calls the secondary function where
* the variables can change.
**/
public static function createProducts() {
    // Create connection
    $conn = new mysqli(SERVERNAME, USERNAME, PASSWORD, DBNAME, PORT);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // This will go through each row and echo the id column
    $productResults = mysqli_query($conn, "SELECT * FROM product_creation_queue");
    if(mysqli_num_rows($productResults) > 0) {
        $rowIndex = 0;
        while($row = mysqli_fetch_assoc($productResults)){
            self::createProduct($conn, $product);
        }
    }

}

/**
* The second function where I see both $product and $productId changing
* from time to time, which completely breaks the code. Their values
* only change after the call to self::createProduct() which is simply a 
* curl function to hit an api endpoint.
**/
public static function createProduct($mysqlConnection, $product) {

    // convert back to array from json
    $productArray = json_decode($product, TRUE);

    // here the value of $productId is one thing
    $productId = $productArray['product']['id'];

    // here is the curl call
    $addProduct = self::api_call(TOKEN, SHOP, ENDPOINT, $product, 'POST');

    // and randomly here it can revert to it's last value in a previous loop
    echo $productId;

}

1 个答案:

答案 0 :(得分:0)

问题是整个40个查询过程花费了超过一分钟的时间才能完成。在第一分钟启动该程序的cron作业将在第一个任务完成之前启动下一个任务,从而以某种方式即时重新分配变量。查询通常用时不到一分钟,但是当查询时间较长时,就会出现冲突,从而导致出现随机性。

我减少了每分钟的查询数量,因此现在该过程在不到60秒的时间内完成,并且从未覆盖任何变量。我仍然不了解如果同时发生两个php进程,变量将如何变化-好像它们会被孤立。