इसलिए, मुझे एक अन्य कर्मचारी द्वारा एक पुरानी परियोजना सौंपी गई। यह बुरी तरह से कोडित है और लगभग मुझे मेरी नौकरी छोड़ दी है। दो बार । क्योंकि मेरे पास इतना समय नहीं है (मुझे इस कार्य के लिए 2 सप्ताह का समय दिया गया था), मैं पूरी बात फिर से नहीं लिख सकता। जैसा कि मुझसे पूछा गया था, मैंने इसे संशोधित किया और वर्तमान में, मैं परीक्षण कर रहा हूं। समस्या यह है, कोड को अन्य वर्षों में व्यवहार में परिवर्तन करना चाहिए। इस समस्या के साथ समस्या यह है कि कोई केंद्रीय स्थान नहीं है जहां वर्तमान वर्ष निर्धारित किया गया है, यह date("Y") का उपयोग करते हुए सभी कोड पर है जो मुझे लगभग 200 फ़ाइलों को बदलने के लिए मजबूर करेगा।

तो, सबसे आसान समाधान पीएचपी को शुरुआत में बताना होगा: "अरे, यह वर्ष 20xx है"। मैंने date_default_timezone_set() कोशिश की, लेकिन इसने मेरी बिल्कुल मदद नहीं की। तो मैं क्या देख रहा हूँ:

  • एक PHP-कमांड जो वर्तमान वर्ष को सेट मान में बदलता है (जैसे Set_Date("Y", 2016);)
  • Apache-Servercommand जो वर्तमान समय को बदलता है (जैसे setdate -Y 2016)

वहाँ किसी भी तरह से या कम से कम एक पटकथा बनाने के लिए लगता है कि यह एक और साल है?

5
Realitätsverlust 4 पद 2015, 15:41

4 जवाब

सबसे बढ़िया उत्तर

आप runkit_function_redefine ()
का उपयोग करके कार्यों को फिर से परिभाषित कर सकते हैं लेकिन आपको रनवे PECL एक्सटेंशन सेटअप करने की आवश्यकता है

नोट : मैंने इसका परीक्षण नहीं किया!

<?php 
print date("Y");

$date = 'print "Hello, it is a new definition of date function <" . $Y . ">"; return 2014; ';
runkit_function_redefine('date', '$Y', $date);

date("Y");
3
Halayem Anis 4 पद 2015, 13:10

यह संभवतः आपके मामले के लिए उपयुक्त नहीं है, लेकिन मुझे लगा कि मुझे नामस्थान के इस दुरुपयोग को साझा करना चाहिए:

<?php

namespace FakeTime;

function date($format, $time=null){
    return 2001;
}

var_dump(date('Y'));
2
Álvaro González 4 पद 2015, 12:59

जैसे ही https://github.com/wolfcw/libfaketime का वर्णन करने के अनुसार मुट्ठी संकलन संकलन करें

गतिशील रूप से आप की जरूरत लिपियों में बेक्ड libfaketime लोड करें

if (!extension_loaded('libfaketime')) {
    dl('libfaketime.so');
}

वैकल्पिक:

प्रत्येक फ़ाइल के लिए dl(.. कमांड को प्रीपेंड करने के लिए auto_prepend_file कॉन्फ़िगरेशन का उपयोग करें।

अन्य संभावित तरीका बस एक दूसरी PHP स्थापना को संकलित करना और दिनांक कार्यों को संशोधित करना है: https://github.com/php/php-src/blob/master/ext/date/php_date.c

1
Daniel W. 4 पद 2015, 13:12

यह अन्य उपयोगकर्ताओं के सुझाव का एक संयोजन है और मैं libfaketime का उपयोग कैसे करता हूं। PECL एक्सटेंशन की आवश्यकता नहीं है।

आप /etc/apache2/envvars को संशोधित करके बहुत आसानी से नकली समय निकाल सकते हैं बस जोड़ दो:

export FAKETIME="2015-12-04 12:41:15"
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1

सुनिश्चित करें कि LD_PRELOAD गिट स्रोत के लिए अंक। अब अपने apache2 को पुनः आरंभ करें और आप उस समय वापस आ जाएंगे, जहां आपने यह प्रश्न पूछा है!

1
cb0 23 मार्च 2016, 14:22