跳过 fopen() 函数 - 未创建文件 | PHP

fopen() function being skipped - No file is created | PHP

我已经为此工作了几个星期,但我又一次面临文件问题。此 sheet 代码首先获取数据库中存在的所有条目,然后在获取一系列 ID 后,启动带有附加 WHERE 子句的相同查询以搜索属于客户的特定条目。

最后,比较两个结果数组以搜索数据库中存在但尚未分配给任何客户的任何条目以将它们打印到 csv 文件中,以便启动代码的用户可以解决阻止这些条目的问题链接到客户。

我过去一直遇到一些关于文件和权限的问题,但这次没有出现错误,也没有消息提醒我我无权在所需位置打开文件或任何其他内容。

我尝试在 sheet 中插入一些 var_dump() 以查看进程是否真的达到了 fopen()。它只是跳过它,没有创建文件,也没有写入数据。

我查看了服务器日志,但什么也没发现,我启用了错误和警告。

这将从数据库中获取所有条目。

$stmtOutgoing = $connAccounting->prepare("SELECT a.`zone`, b.`source_customer_billing_zone_id`, b.`source_external_subscriber_id`, count(*) AS llamadas, SUM((CEIL(b.`duration`))) AS duracion, SUM((b.`source_customer_cost`)/100) AS total, SUM((b.`source_customer_cost`)/100)/SUM((CEIL(b.`duration`))) AS precio  
                                            FROM `billing`.billing_zones a INNER JOIN cdr b 
                                            ON a.`id` = b.`source_customer_billing_zone_id` 
                                            WHERE source_provider_id = :reseller_id 
                                            GROUP BY b.`source_external_subscriber_id`, a.`zone` 
                                            ORDER BY total desc");
$stmtOutgoing->execute(array('reseller_id' => $reseller));




foreach ($stmtOutgoing as $row) {
    
    array_push($totalEntries, $row);
    echo "CDR Entry Added ";
}

获得ids后,loop将所有ids插入到这个查询中:

foreach ($invoices as $invoice) {
    if ($invoice['date'] >= $minDateSearchTstmp && !empty($invoice["customFields"]) && $invoice["customFields"][0]["field"] == "ID_EXTERNAL" && $invoice["customFields"][0]["value"] != "") {

        $z = 0;
        while ( isset($invoice['customFields'][$z]['field']) && $invoice['customFields'][$z]['field'] == 'ID_EXTERNAL' ) {

            $source_external_subscriber_id = $invoice["customFields"][0]["value"]; 

            renewConnection($connAccounting, $stmtOutgoing, $stmtIncoming);
            require '../connections/accountingConnection.php';



            /*Outgoing*/
            $stmtOutgoing = $connAccounting->prepare("SELECT a.`zone`, b.`source_customer_billing_zone_id`, b.`source_external_subscriber_id`, count(*) AS llamadas, SUM((CEIL(b.`duration`))) AS duracion, SUM((b.`source_customer_cost`)/100) AS total, SUM((b.`source_customer_cost`)/100)/SUM((CEIL(b.`duration`))) AS precio  
                                            FROM `billing`.billing_zones a INNER JOIN cdr b 
                                            ON a.`id` = b.`source_customer_billing_zone_id` 
                                            WHERE source_external_subscriber_id = :source_external_subscriber_id AND source_provider_id = :reseller_id 
                                            GROUP BY b.`source_external_subscriber_id`, a.`zone` 
                                            ORDER BY total desc");
                $stmtOutgoing->execute(array('source_external_subscriber_id' => $source_external_subscriber_id, 'reseller_id' => $reseller));

            
            foreach ($stmtOutgoing as $row) {
                
                array_push($holdedEntries, $row);
                echo "Holded Entry Added ";
            }

        }
    }
}

最后,这段代码应该生成文件并用获得的信息填充它:

foreach ($totalEntries as $tEntry) {
    if (!in_array($tEntry, $holdedEntries)) {
        array_push($unassignedEntries, $tEntry);
    }
}


$fp = fopen('./unassigned_cdr_entries/entradasSinAsignar'.$fileDate.'.csv', 'w');
$delimiter = ',';
$enclosure = '"';
$escape_char = "\";

foreach ($unassignedEntries as $unassignedEntry) {
    var_dump($unassignedEntry);
    fputcsv($fp, $unassignedEntry, $delimiter, $enclosure, $escape_char);
}


fclose($fp);

文件的原始权限是:

-rw-r--r-- 1 root root   152 Sep  4 13:26 'Resultados diferencias Cdr-Holded'
-rw-r--r-- 1 root root  6358 Sep  4 14:24  fetch_repeated_and_similar_ids.php
-rw-r--r-- 1 root root  3564 Sep  4 13:26  fetch_repeated_ids.php
-rw-r--r-- 1 root root  3733 Sep  4 13:26  fetch_similar_ids.php
-rw-r--r-- 1 root root  6057 Sep  4 13:26  holded-cdr_data_difference.php
drwxr-xr-x 2 root root  4096 Sep  1 16:57  repeated_ids
-rw-r--r-- 1 root root 14661 Sep  4 13:26 'unassignedCdrEntriesTest(Old).php'
drwxr-xr-x 2 root root  4096 Sep  7 10:04  unassigned_cdr_entries
-rw-r--r-- 1 root root  7616 Sep  7 16:23  unassigned_cdr_entries.php
-rw-r--r-- 1 root root 19613 Sep  4 13:26  unassigned_cdr_entries_for_two_months.php

我试过 chmod 766chmod 777 无济于事。正如我所说,甚至没有警告告诉我由于权限不足我无法在那里打开文件。您可能还会看到 var_dump() 放在最后 foreach() loop。进程到达那里并且数组不为空,因为有两个测试条目未分配给任何人。同样作为回顾,没有发现其他警告或错误:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

如有任何想法或建议,我们将不胜感激!

我忘了 post 我找到的解决方案作为答案。这里的问题在于,每次我用新文件覆盖旧文件时,由于我不知道的原因,文件的所有者和权限都发生了变化,从而阻止了 apache 用户 www-data 创建文件。

项目文件夹是通过 ssh 发送的,所以每当我必须更新某些东西时,我只会使用 chownchmod 来恢复受影响的 folder/file 的用户和权限www-data755 分别。