अपडेट करें
मैंने समस्या हल की और एक उत्तर पोस्ट किया। हालाँकि, मेरा समाधान 100% आदर्श नहीं है। मैं बहुत बल्कि केवल symlink
के cache
साथ clearstatcache(true, $target)
या से दूर होगा, clearstatcache(true, $link)
लेकिन यह काम नहीं करता है।
मैं भी पहले से सहानुभूति के कैशिंग को रोकने के बजाय बहुत कुछ करूंगा या इसे उत्पन्न करने के तुरंत बाद कैश से सिमलिंक को हटा दूंगा। दुर्भाग्य से, मेरे पास कोई भाग्य नहीं था। किसी कारण के clearstatcache(true)
बाद एक सिमलिंक बनाने से काम नहीं होता है, यह अभी भी कैश हो जाता है।
मैं खुशी-खुशी किसी को भी पुरस्कार दूंगा जो मेरे उत्तर को बेहतर बना सके और उन मुद्दों को हल कर सके।
संपादित करें
मैंने हर बार clearstatcache
चलाई गई फ़ाइल को जनरेट करके अपने कोड को ऑप्टिमाइज़ करने का प्रयास किया है, ताकि मुझे केवल प्रत्येक सिम्लिंक के लिए एक बार कैश साफ़ करने की आवश्यकता हो। किसी कारण से, यह काम नहीं करता है। पथ में शामिल होने के लिए clearstatcache
हर बार कॉल करने की आवश्यकता होती है symlink
, लेकिन क्यों? मेरे पास जो समाधान है उसे अनुकूलित करने का एक तरीका होना चाहिए।
के PHP 7.3.5
साथ उपयोग कर रहा हूं nginx/1.16.0
। कभी-कभी file_get_contents
गलत मान लौटाता है जब a symlink
। सिम्लिंक को हटाने और फिर से बनाने के बाद समस्या यह है कि इसका पुराना मूल्य कैश में रहता है। कभी-कभी सही मान वापस किया जाता है, कभी-कभी पुराना मूल्य। यह यादृच्छिक प्रतीत होता है।
मैंने कैश साफ़ करने या कैशिंग रोकने की कोशिश की है:
function symlink1($target, $link)
{
realpath_cache_size(0);
symlink($target, $link);
//clearstatcache(true);
}
मैं वास्तव में कैशिंग को अक्षम नहीं करना चाहता, लेकिन मुझे अभी भी file_get_contents के साथ 100% सटीकता की आवश्यकता है।
संपादित करें
मैं अपने स्रोत कोड को पोस्ट करने में असमर्थ हूं, क्योंकि यह बहुत लंबा और जटिल है, इसलिए मैंने एक न्यूनतम, प्रतिलिपि प्रस्तुत करने योग्य उदाहरण (index.php) बनाया है जो समस्या को फिर से बनाता है:
<h1>Symlink Problem</h1>
<?php
$dir = getcwd();
if (isset($_POST['clear-all']))
{
$nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
foreach ($nos as $no)
{
unlink($dir.'/nos/'.$no.'/id.txt');
rmdir($dir.'/nos/'.$no);
}
foreach (array_values(array_diff(scandir($dir.'/ids'), array('..', '.'))) as $id)
unlink($dir.'/ids/'.$id);
}
if (!is_dir($dir.'/nos'))
mkdir($dir.'/nos');
if (!is_dir($dir.'/ids'))
mkdir($dir.'/ids');
if (isset($_POST['submit']) && !empty($_POST['id']) && ctype_digit($_POST['insert-after']) && ctype_alnum($_POST['id']))
{
$nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
$total = count($nos);
if ($total <= 100)
{
for ($i = $total; $i >= $_POST['insert-after']; $i--)
{
$id = file_get_contents($dir.'/nos/'.$i.'/id.txt');
unlink($dir.'/ids/'.$id);
symlink($dir.'/nos/'.($i + 1), $dir.'/ids/'.$id);
rename($dir.'/nos/'.$i, $dir.'/nos/'.($i + 1));
}
echo '<br>';
mkdir($dir.'/nos/'.$_POST['insert-after']);
file_put_contents($dir.'/nos/'.$_POST['insert-after'].'/id.txt', $_POST['id']);
symlink($dir.'/nos/'.$_POST['insert-after'], $dir.'/ids/'.$_POST['id']);
}
}
$nos = array_values(array_diff(scandir($dir.'/nos'), array('..', '.')));
$total = count($nos) + 1;
echo '<h2>Ids from nos directory</h2>';
foreach ($nos as $no)
{
echo ($no + 1).':'.file_get_contents("$dir/nos/$no/id.txt").'<br>';
}
echo '<h2>Ids from using symlinks</h2>';
$ids = array_values(array_diff(scandir($dir.'/ids'), array('..', '.')));
if (count($ids) > 0)
{
$success = true;
foreach ($ids as $id)
{
$id1 = file_get_contents("$dir/ids/$id/id.txt");
echo $id.':'.$id1.'<br>';
if ($id !== $id1)
$success = false;
}
if ($success)
echo '<b><font color="blue">Success!</font></b><br>';
else
echo '<b><font color="red">Failure!</font></b><br>';
}
?>
<br>
<h2>Insert ID after</h2>
<form method="post" action="/">
<select name="insert-after">
<?php
for ($i = 0; $i < $total; $i++)
echo '<option value="'.$i.'">'.$i.'</option>';
?>
</select>
<input type="text" placeholder="ID" name="id"><br>
<input type="submit" name="submit" value="Insert"><br>
</form>
<h2>Clear all</h2>
<form method="post" action="/">
<input type="submit" name="clear-all" value="Clear All"><br>
</form>
<script>
if (window.history.replaceState)
{
window.history.replaceState( null, null, window.location.href );
}
</script>
यह Nginx
विन्यास के साथ एक समस्या होने की बहुत संभावना थी । इन लाइनों के न होने से समस्या पैदा हो सकती है:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
यहाँ मेरा Nginx
विन्यास है (आप देख सकते हैं कि मैंने उपरोक्त पंक्तियों को शामिल किया है):
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.websemantica.co.uk;
root "/path/to/site/root";
index index.php;
location / {
try_files $uri $uri/ $uri.php$is_args$query_string;
}
location ~* \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $realpath_root$fastcgi_path_info;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $https;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
fastcgi_index index.php;
fastcgi_read_timeout 3000;
}
if ($request_uri ~ (?i)^/([^?]*)\.php($|\?)) {
return 301 /$1$is_args$args;
}
rewrite ^/index$ / permanent;
rewrite ^/(.*)/$ /$1 permanent;
}
वर्तमान में मेरे पास उपरोक्त उदाहरण https://www.websemantica.co.uk पर हैं ।
प्रपत्र में कुछ मान जोड़ने का प्रयास करें। इसे Success!
हर बार नीले रंग में प्रदर्शित किया जाना चाहिए । कभी-कभी Failure!
लाल रंग में दिखाता है। यह काफी कुछ पृष्ठ रीफ्रेश लेने से बदलने के लिए कर सकते हैं Success!
करने के लिए Failure!
या इसके विपरीत। आखिरकार, यह Success!
हर बार दिखाई देगा , इसलिए किसी प्रकार की कैशिंग समस्या होनी चाहिए।
realpath
के साथ file_get_conents
और कोई भाग्य। यह अभी भी कभी-कभी कैश से लोड होता है।
realpath
, बल्कि कुछ ऐसा हैclearstatcache(true); file_get_conents(realpath($fileName));
realpath
फ़ंक्शन पेज पर बहुत उपयोगी टिप्पणी मिली । शायद यह आपकी मदद कर सके।