לדעתי אין ברירה רק לחכות כמה וכמה שעות טובות..
אני חושב שהכל מוגדר נכון רק לוקח זמן להתעכן
בשונה מדומיינים בינלאומיים שרכשתי בעבר שתוך כמה דקות מהרכישה כבר עבד חלק..
נחכה בסבלנות
חוקר
-
דומיין ישראלי כולנו.ישראל -
מה בין תעודת ssl מ lets encryp't לתעודה בתשלום@dovid אמר במה בין תעודת ssl מ lets encryp't לתעודה בתשלום:
מי שעושה זאת בחברות אחרות
אני הוצרכתי לעבור לתעודה של גודדי בגלל שישיבה על קברו פעיל מתוך מכשירי נדרים פלוס וחלק מהם גרסאות אנדרואיד ישנות. לפני כחצי שנה פג תוקף של אחת מתעודה השרשרת של המנפיק ב lets encryp't וכתוצאה מכך השימוש היה בתעודה אחרת חדשה יותר אבל תעודה שעדיין לא הייתה קיימת במכשירים ישנים (גם לא בווינדוס 7), ולכן הוצרכתי לעבור למנפיק שיש לו תעודה מוסמכת ברת תוקף גם למכשירים ישנים.
(על הדרך עשיתי תעודה אחת התקיפה לכל תתי הדומיינים, שגם זה אפשרות שלא קיימת ב lets encryp't) -
פונקציה בPHP לאימות כרטיס אשראימצ"ב מחלקה שמצאתי וערכתי אותה לאימות כרטיס אשראי של ישראכרד מקומי, שהוא אלוגריתם אחר מהשאר.
/** * Validates popular debit and credit cards numbers against regular expressions and Luhn algorithm. * Also validates the CVC and the expiration date. * * @author Ignacio de Tomás <nacho@inacho.es> * @copyright 2014 Ignacio de Tomás (http://inacho.es) */ // $CreditCard1 = new CreditCard(); //$card = CreditCard::validCreditCard('5500005555555559', 'mastercard'); //$card = CreditCard::validCreditCard('123456789'); //print_r($card); //$validCvc = CreditCard::validCvc('001', 'visa'); //var_dump($validCvc); //$validDate = CreditCard::validDate('30', '01'); // past date //var_dump($validDate); //$validDate = CreditCard::validDate0('0218'); // past date //var_dump($validDate); //namespace Inacho; class CreditCard { protected static $cards = array( // Debit cards must come first, since they have more specific patterns than their credit-card equivalents. 'mastercard' => array( 'type' => 'mastercard', 'pattern' => '/^(5[0-5]|2[2-7])/', 'length' => array(16), 'cvcLength' => array(3), 'luhn' => true, ), 'visa' => array( 'type' => 'visa', 'pattern' => '/^4/', 'length' => array(13, 16), 'cvcLength' => array(3), 'luhn' => true, ), 'israrcard' => array( 'type' => 'israrcard', 'pattern' => '/^[0-9]/', 'length' => array(8,9), 'cvcLength' => array(3), 'luhn' => true, ), 'amex' => array( 'type' => 'amex', 'pattern' => '/^3[47]/', 'format' => '/(\d{1,4})(\d{1,6})?(\d{1,5})?/', 'length' => array(15), 'cvcLength' => array(3, 4), 'luhn' => true, ), 'dinersclub' => array( 'type' => 'dinersclub', 'pattern' => '/^3[0689]/', 'length' => array(14), 'cvcLength' => array(3), 'luhn' => true, ), 'visaelectron' => array( 'type' => 'visaelectron', 'pattern' => '/^4(026|17500|405|508|844|91[37])/', 'length' => array(16), 'cvcLength' => array(3), 'luhn' => true, ), /* 'maestro' => array( 'type' => 'maestro', 'pattern' => '/^(5(018|0[23]|[68])|6(39|7))/', 'length' => array(12, 13, 14, 15, 16, 17, 18, 19), 'cvcLength' => array(3), 'luhn' => true, ), 'forbrugsforeningen' => array( 'type' => 'forbrugsforeningen', 'pattern' => '/^600/', 'length' => array(16), 'cvcLength' => array(3), 'luhn' => true, ), 'dankort' => array( 'type' => 'dankort', 'pattern' => '/^5019/', 'length' => array(16), 'cvcLength' => array(3), 'luhn' => true, ), // Credit cards 'discover' => array( 'type' => 'discover', 'pattern' => '/^6([045]|22)/', 'length' => array(16), 'cvcLength' => array(3), 'luhn' => true, ), 'unionpay' => array( 'type' => 'unionpay', 'pattern' => '/^(62|88)/', 'length' => array(16, 17, 18, 19), 'cvcLength' => array(3), 'luhn' => false, ), 'jcb' => array( 'type' => 'jcb', 'pattern' => '/^35/', 'length' => array(16), 'cvcLength' => array(3), 'luhn' => true, ), */ ); public static function validCreditCard($number, $type = null) { $ret = array( 'valid' => false, 'number' => '', 'type' => '', ); // Strip non-numeric characters $number = preg_replace('/[^0-9]/', '', $number); if (empty($type)) { $type = self::creditCardType($number); } if (array_key_exists($type, self::$cards) && self::validCard($number, $type)) { return array( 'valid' => true, 'number' => $number, 'type' => $type, ); } return $ret; } public static function validCvc($cvc, $type) { return (ctype_digit($cvc) && array_key_exists($type, self::$cards) && self::validCvcLength($cvc, $type)); } public static function validDate0($monthyear) { if (strlen($monthyear)!=4) return false; // print $monthyear; $month = mb_substr($monthyear, 0, 2); $year = mb_substr($monthyear, 2, 2); if (self::validDate($year, $month)) return true; else return false; } public static function validDate($year, $month) { $year = '20'.$year; $month = str_pad($month, 2, '0', STR_PAD_LEFT); if (! preg_match('/^20\d\d$/', $year)) { return false; } if (! preg_match('/^(0[1-9]|1[0-2])$/', $month)) { return false; } // past date if ($year < date('Y') || $year == date('Y') && $month < date('m')) { return false; } return true; } public static function ValidateID($str) { $IDnum = strval($str); if(! ctype_digit($IDnum)) return false; if((strlen($IDnum)>9) || (strlen($IDnum)<5)) return false; while(strlen($IDnum)<9) { $IDnum = '0'.$IDnum ; } $mone = 0; for($i=0; $i<9; $i++) { $char = mb_substr($IDnum, $i, 1); $incNum = intval($char); $incNum*=($i%2)+1; if($incNum > 9) $incNum-=9; $mone+= $incNum; } if($mone%10==0) return true; else return false; } // PROTECTED // --------------------------------------------------------- protected static function creditCardType($number) { foreach (self::$cards as $type => $card) { if (preg_match($card['pattern'], $number) && self::validLength($number, $type)) { return $type; } } return ''; } protected static function validCard($number, $type) { return (self::validPattern($number, $type) && self::validLength($number, $type) && self::validLuhn($number, $type)); } protected static function validPattern($number, $type) { return preg_match(self::$cards[$type]['pattern'], $number); } protected static function validLength($number, $type) { foreach (self::$cards[$type]['length'] as $length) { if (strlen($number) == $length) { return true; } } return false; } protected static function validCvcLength($cvc, $type) { foreach (self::$cards[$type]['cvcLength'] as $length) { if (strlen($cvc) == $length) { return true; } } return false; } protected static function validLuhn($number, $type) { if (! self::$cards[$type]['luhn']) { return true; } else { return self::luhnCheck($number); } } protected static function luhnCheck($number) { $checksum = 0; for ($i=(2-(strlen($number) % 2)); $i<=strlen($number); $i+=2) { // print $i."<br/>"; $checksum += (int) ($number{$i-1}); // print_r($checksum); } // Analyze odd digits in even length strings or even digits in odd length strings. for ($i=(strlen($number)% 2) + 1; $i<strlen($number); $i+=2) { $digit = (int) ($number{$i-1}) * 2; if ($digit < 10) { $checksum += $digit; } else { $checksum += ($digit-9); } } if (($checksum % 10) == 0) { return true; } else { return self::luhnCheck2($number); } } protected static function luhnCheck2($number) { if ($number == 123456789) return false; //$checksum = 0; //$IDnum = $number; /* while(strlen($number)<9) { // print "123"; $number = '0'.$number ; } //$number = $IDnum;*/ // $ii = 0; $number = str_pad($number, 9,'0', STR_PAD_LEFT); //print $number; $mone = 0; for($i=0; $i<9; $i++) { $iii = $i; if ($i == 0) $ii = 0; else $ii = -$iii; $ii--; $char = mb_substr($number, $ii, 1); // print $char; $incNum = intval($char); $incNum*=($i+1); // print $incNum."<br/>"; // if($incNum > 9) // $incNum-=9; $mone+= $incNum; } if($mone%11==0){ return true; } else { return false; } /* for ($i=(2-(strlen($number) % 2)); $i<=strlen($number); $i+=2) { $checksum += (int) ($number{$i-1}); } // Analyze odd digits in even length strings or even digits in odd length strings. for ($i=(strlen($number)% 2) + 1; $i<strlen($number); $i+=2) { $digit = (int) ($number{$i-1}) * 2;+ if ($digit < 10) { $checksum += $digit; } else { $checksum += ($digit-9); } } if (($checksum % 10) == 0) { return true; } else { return false; } */ } }
-
ייבוא רשימת מספרים למסד נתונים@שואף אמר בייבוא רשימת מספרים למסד נתונים:
@dovid וואו מדהים תודה רבה
אני משער שטעינה של קובץ CSV תהיה הרבה הרבה יותר מהירה מאשר חמישים אלף התחברויות רצופות לשרת המסד נתוניםלא יותר מהיר אלא לא להשוות בכלל וכלל!!
למיטב זכרוני יבוא של 30K עם 12 עמודות לקח לי מספר שניות -
שם עמודה בעברית בMYSQLלגבי החלק הטכני:
העליתי כאן מחלקה פשוטה לשימוש בMySQL וכן MSSQL.
במחלקה זו השתמשתי ע"י קשירת הנתונים, וזה עובד חלק גם בנתונים בעברית.
אך יש לקחת נקודה פשוטה בחשבון, ישנו תו`
וישנו
'
ה
`
מיועד עבור חיתום שמות של עמודות וטבלאות וכדומה בnysql וגרש מיועד לחתימת מחרוזת.
אם אכתוב בשאילתהSELECT * FROM `users` WHERE 'columnA' = :A:
השרת לא יחפש עמודה בשם columnA אלא האם מחרוזת 'columnA' שווה את החיפוש המבוקש.
ולכן חייבים לחתום דווקא כך`columnA`
ואז השרת מזהה אותו כעמודה.
ולכן אם רוצים לקשור את שם העמודה עצמו זה בעיה, כי הקשירה מכניסה את הערך לשאילתה כמחרוזת (היות והיא מקבלת מחרוזת) לדוגמאSELECT * FROM `users` WHERE :colName = :val
יתורגם ל:
SELECT * FROM `users` WHERE 'id' = 1
ולכן זה לא יעבוד.
כי 'id' אינו שוה 1.בחלק ההשקפתי, אני מסכים שתיכנות כדאי לעשות הכל באנגלית כי הוא יותר נתמך, וכו'.
אבל לא לזלזל בשימוש בעברית, למרות שאני משתדל לא להצטרך להגיע לעברית, אבל יצא לי פה ושם שהייתי צריך לעשות דברים בעברית, וזה לא היה בעייתי לא בPHP, לא בMYSQL, וגם לא בAPI לדפדפן כשהמערך JSON משתמש במפתחות בעברית.
וכהנה רבות.
ישנו בתודעה של מפתחים שאין להשתמש בעברית, אבל אם באמת תוכנה/שפה זו כן תומכת בעברית, אז מה באמת הבעיה??? -
בניית מחלקת תקשורת עם ימות המשיח API ב nodejsשימו לב:
חדש! מהיום ישנה דרך נוספת להתחבר. אין צורך ליצור טוקן ולבצע פעולות באמצעות הטוקן, אלא ניתן בקריאה עצמה לשדר במקום טוקן את פרטי הכניסה.
לדוגמאtoken=091234567:1234
ניתן לראות כאן דוגמת שימוש
http://www.call2all.co.il/f2/viewtopic.php?f=8&t=5022
מבדיקה מול המכנת הראשי בימות המשיח, האפשרות הזו עובדת בכל המקומות במקום טוקן!
שימו לב שזה יכול להיות פחות מאובטח שבכל בקשה שולחים את הפרטים המלאים, אבל מצד שני במקום שצריך לעשות רק קריאה אחת, אז זה ודאי לא אחרת מהקריאה ליצירת הטוקן.. -
פילוח נתונים ב mySQL@dovid אמר בפילוח נתונים ב mySQL:
SELECT IF(CountCIty > 15, City, "כל הערים"), SUM(CountCIty) FROM ( SELECT City, Count(ID) AS CountCIty FROM Table GROUP BY City ) GROUP BY IF(CountCIty > 15, City, "כל הערים")
התחביר הזה ספציפית נכון רק לmySql. אבל הרעיון תמיד אפשרי.
עבד מצויין מלבד תיקון קטן שזה דרש כינוי לטבלה
SELECT IF(CountCIty > 35, City, "כל הערים"), SUM(CountCIty) FROM ( SELECT City, Count(`id`) AS CountCIty FROM Contacts GROUP BY City ) as CountTable GROUP BY IF(CountCIty > 35, City, "כל הערים")
-
עדכון תהליך ה NODEJS לאחר ביצוע עריכה בד"ב MySQLמה מומלץ/אפשרי לעשות עבור נתונים סטטיים קבועים, אשר מפעם לפעם משתנים ע"י המשתמש.
כגון בישיבה על קברו יש לי טבלת שאלות ותשובות, בדר"כ מכניסים בהם את השאלות כל יום יום שלמחרת, אך מפעם לפעם ייתכנו שינויים כתיקוני כתיב באותו יום.
בנוד אני לא עושה שליפה כל פעם לכל משתמש, זה פשוט מיותר ומעמיס.
הנתונים נשמרים במשתנה בתהליך, ומשם נשלחים למשתמש.
עד היום עבדתי בשיטה של פונקציית עדכון נתונים עם תזמון כל כשלו דקות לעדכון מחדש מול השרת.
יוצא לי לאחרונה לעבוד די הרבה עם סיטואציות כאלו, ולדעתי צריך פתרון יותר מושלם.
האם יש אפשרות להגדיר איזשהו מנגנון שידע לזהות שרק כאשר בוצע שינוי בד"ב יבוצע שליפה מחדש?
נניח לבנות API שקורא לפונקציית הריענון וליצור טריגר בד"ב שבכל שינוי של הטבלה זה קורא לAPI של העדכון בתהליך הנוד?
האם זה אפשרי? או אולי יש רעיון יותר טוב? -
בניית מחלקת תקשורת עם ימות המשיח API ב nodejs@MusiCode אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:
@חוקר אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:
@zvizvi אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:
מציע לשים את הקוד בGithub כדי שיהיה אפשר לתרום ולשפר אותו.
אשאל את ימות המשיח אם יש להם בעיה בזה.
אם אין בעיה, בהחלט שזה יכול להיות לעניין, כי ימות המשיח הוסיפו כל מיני פונקציות מעניינות בAPI, שעדיין אינן מופיעות בתיעוד הרשמי, והן יכולות מאוד לעזור.ספר לנו על זה,
ומאיפה אתה יודע.המתכנת הראשי בימות המשיח שהוא גם המפתח של הAPI אישר את זה מבחינתם.
לגבי הפונקציות החדשות, פשוט מאוד ראיתי שיש לימות אתר חדש בפיתוח https://www.call2all.co.il/yemot-admin-g1/#/login ובדקתי ברכיב הדף איך זה עובד, ופשוט מאוד כל האתר החדש מבוסס על הAPI, ולכן הם הוסיפו את כל האפשרויות הנדרשות.
ביניהם:
קבלת פירוט דקות נכנסות
קבלת רשימת קבצים בתיקיה
שכפול/מחיקה/העברה של קובץ/ים
בקבצי טקסט ניתן העלאת טקסט כטקסט במקום כקובץ.
הורדת טקסט של קובץ טקסט/ini
וכנראה עוד כמה שעדיין לא שמתי לב.המתכנת של ימות אישר שזה בסדר לשימוש, והוא יוסיף את זה בתיעוד בימים הבאים.
מי שמצא פונקציות נוספות, שיכתוב כאן.
בינתיים זה המחלקה לפי מה שכבר הוספתי (אני מקוה בסופו של דבר להכניס את כל הפונקציות בימות כפונקציות במחלקה, זה מאוד יעיל לפי שמשתמש ב IDE.)const fetch = require('node-fetch'); const { URLSearchParams } = require('url'); module.exports = class YmApi { constructor(username, password, ymLink = 'ym') { this.username = username; this.password = password; this.URL = 'https://www.call2all.co.il/' + ymLink + '/api/'; } get token() { if (!this.tokenPromise) { this.tokenPromise = new Promise((resolve, reject) => { let url = this.URL + 'Login?' + 'username=' + this.username + '&password=' + encodeURIComponent(this.password); fetch(url, { method: 'get' }).then(res => res.json()).then(json => { console.log(json); if (json.token) { resolve(json.token); } else { reject('שם משתמש או סיסמא שגויים.'); } }); }) } return this.tokenPromise; } connecting(action, body) { console.log('action ' + action); return this.token.then( token => { let params = new URLSearchParams(); params.append('token', token); if (body) { for (let i in body) { params.append(i, body[i]); } } let url = this.URL + action; return fetch(url, { method: 'POST', body: params }).then(res => res.json()).catch(console.error); }); } Logout(){ return this.connecting('Logout'); } RunCampaign(templateId, phones, callerId = false){ let body = { templateId : templateId, phones : phones, }; if (callerId){ body['callerId'] = callerId; } return this.connecting('RunCampaign', body); } GetTemplates(){ return this.connecting('GetTemplates'); } GetTemplates2(){ return this.connecting2('GetTemplates'); } GetIvrTree(path){ return this.connecting('GetIvrTree', {path : 'ivr2:' + path}); } GetIncomingCalls(){ return this.connecting('GetIncomingCalls'); } GetTextFile(what){ return this.connecting('GetTextFile', {'what' : 'ivr2:' + what}); } UploadTextFile(what, contents){ return this.connecting('UploadTextFile', {'what' : 'ivr2:' + what, contents : contents}); } FileAction(action, what, target){ //action = [move, copy, delete] let body = {action : action, 'target' : 'ivr2:' + target}; if (typeof what === 'object'){ for (let i = 0; i < what.length;i++) { body['what' + i] = 'ivr2:' + what[i]; } }else{ body['what'] = 'ivr2:' + what; } return this.connecting('FileAction', body); } };
דוגמת שימוש בהמשך להנ"ל
YmApi.FileAction('copy', '/025.wav', '/7').then(function (t) { console.log('FileAction'); console.log(t); });
-
ספירת ערכים כפולים בget בphp@WWW אמר בספירת ערכים כפולים בget בphp:
זה ברור!
"נישט קשה", למה לקטר? אתה היית בונה את זה יותר טוב?
אני לא אומר שזה הכי קל לעבוד מולם, אבל כשזה תחליף להתעסקות לבד עם כל הבלאגן של שרת פרטי, ואתה משקיע במוצר שלך ולא בתשתית, זה ממש ממש מצויין.
כמובן צריך לתכנן את זה טוב, לבנות פונקציות שעושים את העבודה מול ימות ואז הכל זורם.
ולגבי עצם השאלה כאן בפורום אם היה לי יותר זמן וריכוז אולי הייתי מנסה לחשוב על פיתרון, אבל כבר התחלתי את הזמן, והצטבר לי המון עבודה מבין הזמנים שנדחתה עקב שמחה משפחתית, שאין לי כעת את הריכוז, אבל ודאי שאפשר למצוא פיתרון.
כיון אחד שאני יכול לזרוק, לעבוד לפי המזהה שיחה בימות שנשלח בURL שערכו ApiCallId, ולשמור בד"ב או במשתנה בשרת (אם זה נוד או משהו בסגנון זה אפשרי, בPHP חייבים לכאורה ד"ב) לשמור מערך של כל המוצרים שכבר נבחרו, וכן מצביע באיזה מספר מוצר הוא אוחז, ובכל שלב לקדם את המצביע למוצר הבא.
ובנוסף להוסיף לסקריפט תנאי שאם יש בGET משתנה hangup=yes זה מוחק את המערך של שיחה זו מהד"ב, כדי למנוע הצטברות מיותרת של שורות לא רלוונטיות. -
ספירת ערכים כפולים בget בphp@MusiCode
אולי רציתי, לא זכור לי שיצא משהו בסוף.
@nigun
אני אף פעם לא השתמשתי ב PHP בגו טו, אין לי מושג כמה זה יעיל.
אבל מה שכן אני הייתי הולך על כיון אחר, לוקח את $_SERVER["QUERY_STRING"]; ששם יש את המחרוזת של הGET, ומפצל אותו או עושה חיפוש כמה פעמים מופיע הערך המבוקש, וכך אתה יודע באיזה מוצר הוא אוחז.
אבל בכל מקרה זה לא נכון כי אם אתה שולח תמיד את אותו שם של הפרמטר, זה ידרוס תמיד את הערך שנשלח במוצר הקודם, וכל המוצרים חוזרים להיות אותו הקשה.
לכן אולי לעשות פיתרון משהו בנוסח שלexit( "read=t-לאישור הקש אחת לביטול שתיים=approve[],no,1,1,7,No,,,,#12*,," );
שזה יוצר מערך של ההקשות במקום ערך קבוע, ולפי זה לבצע את המעבר ממוצר למוצר.
-
פילטר טבלאות ב phpMyAdminלמעשה עשיתי עדכון גירסה לגירסה האחרונה וזה כן קיים שם.
את הגירסה האחורנה הורדתי מהמקור כפי המופיע כאן ולא ע"י שורת הפקודה כמו בהתקנה הראשונה.
-
מספר שרתי אינטרנט בשרת אחדב"ה הסתדרתי עם הכל, כולל עצירת האפאצ'י ומעבר הכל לnginx.
להלן ההגדרות המלאות למי שזה יכול לעזור# Implement upstream connection to PHP-FPM # "phpfpm" here is a name for this upstream connection, which you can customize # I create a custom upstream connection per vhost, to better segregate PHP processes by vhost # To do the same, you need a unique upstream name, and a unique filename for your php5-fpm.sock file upstream phpfpm { server unix:/var/run/php/php7.2-fpm.sock; #avoid sockets for nginx-fpm on Linux, they are good for BSD #server 127.0.0.1:9000; } server { # Listening on port 80 without an IP address is only recommended if you are not running multiple v-hosts # Bind to the public IP bound to your domain listen 80; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/mydomainname.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/mydomainname.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot # Specify this vhost's domain name server_name mydomainname.com; root /var/www/public_html; index index.php index.html index.htm; # Specify log locations for current site access_log /var/www/mydomainname.com/log/access.log; error_log /var/www/mydomainname.com/log/error.log warn; # Typically I create a restrictions.conf file that I then include across all of my vhosts #include conf.d/restrictions.conf; # I've included the content of my restrictions.conf in-line for this example # BEGIN restrictions.conf # Disable logging for favicon location = /favicon.ico { log_not_found off; access_log off; } # Disable logging for robots.txt location = /robots.txt { allow all; log_not_found off; access_log off; } # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac). location ~ /\. { deny all; access_log off; log_not_found off; } # END restrictions.conf # Typically I create a yiiframework.conf file that I then include across all of my yii vhosts #include conf.d/yiiframework.conf; # I've included the content of my yiiframework.conf in-line for this example # BEGIN yiiframework.conf # Block access to protected, framework, and nbproject (artifact from Netbeans) location ~ /(protected|framework|nbproject) { deny all; access_log off; log_not_found off; } # Block access to theme-folder views directories location ~ /themes/\w+/views { deny all; access_log off; log_not_found off; } # Attempt the uri, uri+/, then fall back to yii's index.php with args included # Note: old examples use IF statements, which nginx considers evil, this approach is more widely supported location / { #root /var/www/public_html/yii/frontend/web; try_files $uri $uri/ /yii/frontend/web/index.php$is_args$args; } # END yiiframework.conf location = / { #rewrite /yii/frontend/web/index.php last; try_files $uri /yii/frontend/web/index.php/ /yii/frontend/web/index.php; } # Tell browser to cache image files for 24 hours, do not log missing images # I typically keep this after the yii rules, so that there is no conflict with content served by Yii location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2|ttf|woff)$ { root /var/www/public_html/yii/frontend/web; #expires 24h; log_not_found off; } # Block for processing PHP files # Specifically matches URIs ending in .php location ~ \.php$ { try_files $uri =404; # Fix for server variables that behave differently under nginx/php-fpm than typically expected fastcgi_split_path_info ^(.+\.php)(/.+)$; # Include the standard fastcgi_params file included with nginx include fastcgi_params; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_index index.php; # Override the SCRIPT_FILENAME variable set by fastcgi_params fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # Pass to upstream PHP-FPM; This must match whatever you name your upstream connection fastcgi_pass phpfpm; } } server { listen 80; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/api.mydomainname.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/api.mydomainname.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot #root /var/www/sub.test.com; #index index.html index.htm index.nginx-debian.html; server_name api.mydomainname.com www.api.mydomainname.com; location / { proxy_pass http://127.0.0.1:8080; #proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # the next 3 lines are for cocket protocol nedded both for web ui and mobile app proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
תודה לעוזרים
-
ריענון מחדש של חלק מתהליך NODEJS@dovid
א. ייתכן, אבל כשאני צריך רוצה להקים 5 פרוייקטים, שכולם משתמשים באותם מודולים, ואותם מחלקות שבניתי, ובסך הכל הם דומים מבחינת התלויות, ורק כל אחד יש לו את הפעולות שלו ואת הטבלאות שלו, הם אני מריף לכל אחד תהליך, זה דורש לכל אחד כמאה מגה ראם, ואז יחד הקצאתי 500 מגה ראם.
משא"כ בתהליך אחד זה לא אמור לצאת יותר 150 מגה ראם, (לא שאני כבר סיימתי לחבר חמר, אלא רק 2, אבל כך זה נראה לי לפי החשבון של שתי פרוייקטים.
אולי זה לא כ"כ נורא, יש לי 4 גיגה שמתוכם בדר"כ 2 פנויים, אבל אני רוצה לנהל מראש את התקציב חסכוני יותר.
אדרבה, תקן אותי אם אני טועה.
ב. זה לא לשינויים שעתיים, אלא שדרוגים והתקדמות בפרוייקטים קיימים או אפילו הוספת פרוייקט חדש.
נניח בישיבה על קברו אני רוצה להוסיף הצגת נתון כללי של כל המשתתפים ביום זה, אני מבצע שינוי בקוד, מאתחל את התהליך, וכעת אני מאתחל סתם את שאר הפרוייקטים ג"כ, דבר שלעצמו לא כ"כ נורא, אבל ייתכנו פה ושם לקוחות שנעצרה להם הבקשה באמצע, וכן ריענון הנתונים השמורים וכו' שלכן אני מעדיך שאת מה שאני לא חייב אני לא מרענן. -
פעולה סינכרונית nodejs@dovid
ב"ה במקביל לעבודה התחלתי להבין יותר מהו פרומיס.
גם מה שכתבת כעת מועיל מאוד.
תודה -
NODEJS עצירת המשך ביצוע פעולות@nigun אמר בNODEJS עצירת המשך ביצוע פעולות:
@חוקר
אני עדיין לא הבנתי מה אתה מרוויח מלעבוד עם NODE בשביל ימות המשיח
יכול להיות שאני טועה
אבל לכאורה אפשר לבנות הכל בPHP ואם יש החלקים שאתה צריך בNODE תבנה אותם בנפרד
ותעשה הפניה מהסקריפט של PHPהן אמת שהרבה דברים, ואת רוב המערכות שלי בניתי ב PHP.
אני משתמש בינתיים בנוד לשני מטרות, מלבד ה בינתיים הכל בPHP (אולי בגלל חבלי קליטה, ואח"כ אני יעבוד רק עם נוד).
כעת מה שאני משתמש בנוד הוא למערכות של צ'רידי וקוזמאצ', ששם יש לנוד מעלה שהתהליך רץ כל הזמן והוא מתרענן מול שרתי החברות הנ"ל ללא קשר לכמות המאזינים, משא"כ בPHP הייתי חייב לבצע בדיקה לכל מאזין בנפרד, דבר שהקשה על השרת ולא עמד טוב בעומסים.
והמטרה הבאה בתור ששיכבתי אותה לנוד (כבר פעילה מערב פסח, אך עדיין אני מעביר בשלבים עוד ועוד חלקים מהמערכת) ישיבה על קברו שיש שם הרבה שאילתאות ונתונים שחוזרים על עצמם שחבל לבדוק אותם מול בסיס הנתונים לכל אחד בנפרד, וחבל לכתוב אותם לכל סקריפט בנפרד אלא הכל מאוחד תחת תהליך אחד שכולל הכל, (כולל אפילו בדיקה באמצעות FTP האם הקבצים למחר כבר נמצאים במערכת בימות המשיח ושליחת התראה למייל וכו').
נגמור עם זה נעשה חושבים מה הלאה.. -
תתי הפניות ב express@יוסף-בן-שמעון אמר בתתי הפניות ב express:
@חוקר אז אתה צריך middleware, כתוב כך:
נראה לי שזה אכן מה שהייתי צריך!
תודה -
תתי הפניות ב express@יוסף-בן-שמעון אמר בתתי הפניות ב express:
@חוקר כמה הארות על הקוד שלך:
- אתה לא צריך לדאוג לקוד תגובה 200, ולא להידר Content-Type, אקספרס כבר עושה את העבודה השחורה הזו, תשתמש במתודה
res.setHeader('Access-Control-Allow-Origin', '*')
- גם לא צריך להמיר את ה JSON למחרוזת, גם לזה אקספרס דואג, תעשה
res.send(maslulim_to_api)
3.לא צריך לנתח את ה URL בכל בקשה, אקספרס מגיש לך את זה מוכן כך:
req.query.someQuery
- לדעתי מה שחסר לך זה לא ראוטינג אלא middleware אבל זה ניחוש, אם תפרט מה בדיוק הצורך שלך יהיה אפשר לדייק
תודה על הערותיך, אני אוהב ללמוד ולהתלמד מהדברים שבין השורות.
טוב שאתה קורא אותי ומבין את הקוד לעצם העניין מה אני יכול לשפר, הקלת עלי. -
התקנת תעודה SSL עבור NODE@חוקר אמר בהתקנת תעודה SSL עבור NODE:
התקנתי את certbot --nginx
אך היות ונוד אינו נגיש מפורט 443 אלא השרת אפאצ'י, וכשאני מנסה לגשת לפורט
https://domain.com:3030
אני מקבל שגיאת אבטחה.
מה ניתן לעשות?
בגדול אני רוצה להשאיר את האפאצי כמות שהוא, כי הוא משמש לחיבורים הדורשים HTTPS, והמטרה הנוכחית היא להנגיש את נוד שהוא בפורטים אחרים, אך שיהיה ג"כ מאובטח.
תודהב"ה הסתדרתי
לאחר ההתקנה הנ"ל נוסף לי בקובץ ההגדרות של nginx
הקוד הזה:listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
מה שעשיתי, שיניתי את הפורט 443 לפורט המבוקש וכעת זה נותן לי להתחבר בצורה מאובטחת לפורט שאני צריך.
תודה לכל העוזרים -
בדיקת עומס על שרת@אהרן אמר בבדיקת עומס על שרת:
@חוקר אמר בבדיקת עומס על שרת:
ממוצע בקשה דרך הדפדפן (של שמיעת מצב הקמפיין האישי או הכללי) הוא 75 מ"ש
כמה לקח עד עכשיו?
כפי שזה היה בנוי בPHP בצ'רידי כ 800 מ"ש