MrSus 13.12.1101:49

שאלה תאורטית בקשר ל PHP

אני בא מעולם ה VBSCRIPT, עבדתי המון עם כתיבה של מאקרוים באקסל ותקשורת עם בסיסי נתונים שנוהלו באקסס. למען האמת, בפרויקטים שלי שילבתי המון אובייקטי COM מכל הסוגים...

לפני כמה חודשים התחלתי להתעניין בעולם ה WEB והתחלתי ללמוד PHP באופן עצמאי. נאלצתי להפסיק בגלל התחלת הלימודים באונ'. רציתי לשאול שאלה שבעיקרון היא תאורטית, אבל רק בגלל שאין לי כל כך זמן ליישם אותה, אבל היא יכולה לפתוח לי את כיווני המחשבה לעתיד.

האם ישנה אפשרות ב PHP לעבוד עם אובייקטי COM כדוגמת האופיס, אקספלורר, וכו'..? הכוונה שלי היא לא התממשקות עם אותם אובייקטים בצד הלקוח, אלא בצד השרת?

למה אני מתכוון?
ניקח בתור דוגמא את המצב הבא:
במחשב השרת יש קובץ אקסל עם כל מיני נתונים.

האם יש אפשרת שברגע שהלקוח נכנס לאתר, אותו קובץ אקסל ייפתח בפועל על הצד של השרת, יקרו בו כמה דברים (נניח איזה פקודת מאקרו), והנתונים שמופיעים בקובץ יוצגו ללקוח על גבי המסך (באתר), ואז הקובץ ייסגר בצד השרת (או שייסגר לפני זה, זה לא משנה..)?

ידוע לי שמה שאני שואל אינו יעיל בעליל, אבל רק בקטע תאורטי האם אפשרי לעשות דבר כזה? ואני לא מדבר רק על אקסל, אלא על כל אובייקט COM שהוא.. וזה כולל דפדפני אינטרנט, adobe reader.. ועוד כל מיני תוכנות שיצא לי לעבוד איתם אבל פחות מוכרות...

תודה!
פורסם גם בפורום תיכנות
Ice Cold 13.12.1109:43
1. אם ה-PHP שלך מותקן על WINDOWS, זה בהחלט אפשרי. בתגובה להודעה מספר 0
MrSus 13.12.1110:43
2. אכן על ווינדוס בתגובה להודעה מספר 1
איזה יופי שאפשרי! אני חייב לבדוק את זה בהזדמנות יש לי כמה רעיונות שימושיים לזה

תודה!
Ice Cold 13.12.1111:49
3. :) וספציפית ל-Excel, חפש קצת על PHPExcel :) בתגובה להודעה מספר 2
CaTz 13.12.1122:53
4. חיזוק! ספרייה מדהימה לעבודה עם EXCEL! בתגובה להודעה מספר 3
MrSus 14.12.1113:26
5. קראתי עליה קצת לפני כמה חודשים בתגובה להודעה מספר 4
אחת מאד פונקציונאלית.. אבל מה שחיפשתי לא נוגע ספציפית לאקסל.
MrSus 14.12.1113:28
6. משום מה אני לא מצליח לעבוד עם זה.. בתגובה להודעה מספר 1
כתבתי רק את השורות הראשונות של הקוד, קצת להתנסות ומשום מה הוא מסוגל להציג רק את הגרסה, אבל הפקודה של ה visible לא עושה כלום.. אני לא רואה שהוא באמת פותח את הוורד במחשב.. גם ב Task Manager זה לא נראה שהוא פותח אותו.. מעניין מאיפה הוא מוציא את הגרסה אם כך.

הקוד שהשתמשתי הוא:
[code]

$word=new COM("word.application") or die("Cannot start word for you");
print "Loaded word version ($word->Version)\n";
$word->visible =1;
[/code]

התקנתי Wamp רק כדי להתנסות בזה, אולי זה קשור.. אבל הוא לא מציג שום שגיאה או משהו.



Ice Cold 14.12.1113:55
7. אתה מצפה שה-WORD ייפתח במחשב של המשתמש?? בתגובה להודעה מספר 6
זה ממש לא יקרה... PHP לא יכול להשפיע על הפעולות של המשתמש.
MrSus 14.12.1115:13
8. השרת רץ על המחשב שלי בתגובה להודעה מספר 7
אני גם המשתמש וגם השרת.
Ice Cold 14.12.1115:28
9. הבנתי. גם אני ניסיתי. לא מוצג, וגם לא מצליח לעשות בתגובה להודעה מספר 8
TypeText ולא SaveAs...

כנראה שב-OFFICE 2007 הפונקציות קצת שונות...
MrSus 14.12.1115:52
10. הפונקציות לא השתנו בתגובה להודעה מספר 9
רק נוספו עוד.. אבל לי הוא כן מציג את הגרסה.. רק שהוא לא באמת פותח את הוורד...
אני אנסה לחפש יותר לעומק באינטרנט.

תודה רבה!
MrSus 14.12.1121:14
11. אוקיי הצלחתי בתגובה להודעה מספר 9
מסתבר שה Wamp הוא זה שגרם לבעיות.. כנראה שהוא מגדיר שם כל מיני הגדרות שמונעות התממשקות עם COM.
התקנתי מחדש בנפרד APACHE ו PHP, וזה עובד..

בעיה נוספת שעלתה זה שבגלל שאני בווינדוס 7, וה Apache מופעל כסרביס, הווינודס לא מאפשר לו לפתוח תוכנות בדסקטופ הפעיל, אז כל פעם שהוא שמופעלת תוכנה כלשהי דרך ה Apache (דרך הסרביס), אז הוא מקפיץ הודעה שצריך לאשר ורק אז הוא מעביר אותך לדסקטופ וירטואלי שבו הוא הפעיל את התוכנה.. בקיצור הפתרון (מחיפוש בגוגל) הוא להפעיל את ה APACHE בקונסול ולא כסרביס..

סה"כ זה דיי נחמד, מקווה שאני אמצא זמן להתעסק עם זה יותר.
Ice Cold 14.12.1122:43
12. תודה רבה על השיתוף :) בתגובה להודעה מספר 11
MrSus 18.12.1120:24
13. יש לי שאלה נוספת באותו עניין בתגובה להודעה מספר 0
אחרי שהצלחתי לממשק את השרת עם אובייקט ה COM, לצורך העניין אקסל, והגדרתי לו שיעשה כל מיני פעולות על הקובץ לפני שהוא מחזיר פלט.. הפעולות שהוא עושה על הקובץ לוקחות זמן (נגיד 10 שניות), איך אני עושה שמי שנכנס לאתר באותו זמן שהשרת לא זמין (הוא הרי עסוק בפעולות שהלקוח הקודם גרם לו להריץ על האקסל), יקבל הודעת "המתן" או משהו כזה? האם אפשרי שהשרת יעבד 2 פקודות במקביל?

השאלות שלי קשורות למשהו טיפה יותר גדול מאקסל, שידרוש מהשרת עבודה ארוכה יחסית (יכול להגיע גם לכמה דקות).. אני לא רוצה שיהיה מצב ש-2 לקוחות יכנסו לשרת בו זמנית ואחד יגרום לשרת לבצע משהו ולבסוף יקבל פלט, והשני ימתין בלי שיידע מה קורה.. או לחילופין - ששני הלקוחות יגרמו לשרת לבצע 2 פעולות על אותו אובייקט COM בו זמנית.. אני רוצה שהפעולות יבוצעו לפי הסדר של המשתמשים באתר, כשהמשתמש שנכנס שני יקבל הודעת "המתנה X דקות" או משהו כזה עד שהפעולה של המשתמש הראשון מסתיימת..

Deuce 23.12.1123:36
14. מכתב בתגובה להודעה מספר 13
ראשית, עבור כל משתמש שנכנס לאתר נפתח אובייקט חדש מולו עובד המשתמש.
דהיינו, אם אני נכנס לאתר ופונה לפונקציה שמעבדת קובץ אקסל ואתה נכנס לאתר ופונה לפונקציה שמעבדת קובץ אקסל אז לכל אחד יש מחלקה משלו עם מרחב זכרון משלה (וכמובן שצריך לטפל במקרי קצה בהם אנחנו חולקים משאב משותף, לדוגמה אם שנינו כותבים לאותו קובץ).

לפעמים אתה מעוניין לחכות לעיבוד של קובץ מסום ובינתיים שהדף ייטען, או אפילו יעדכן אותך כל הזמן במצב של הקובץ. אחד הפתרונות הוא להשתמש בטרדים (אם אתה לא יודע מהם טרדים, אז תקרא על Threads; זה נושא בפני עצמו) - ואפשר להשתמש ב-php בטרדים.

לגבי כמות מסויימת של משתמשים שחולקת את אותו משאב:
כאשר אתה מתכנן מערכת שמציעה פונקציונליות לכמות גדולה של משתמשים בו זמנים, אתה צריך לחשוב כמה מהתהליכים אתה יכול למקבל או לפחות לא מהווים מבחינתך סכנה. אם למשל, עבור כל משתמש אתה מבצע פעולת חישוב שמוציאה פלט והפעולות בלתי תלויות אחת בשנייה, אז אין סיבה להסתבך. השרת יריץ את התוכנה לכל משתמש וה-context switch של המעבד/ים בשרת יחלקו את הריצות במחשב. לעמת זאת, לפעמים הפעולה כ"כ כבדה שאתה לא רוצה שתרוץ על השרת יותר מ-3/4 פעמים ואז צריך לחשוב על ארכיטקטורות שונות ומגוונות. לפעמים משתמשים בתור (יכול להיות DB, יכולה להיות תשתית MQ) ובד"כ מוסיפים עוד שרת שכל מה שהוא עושה זה לעבוד מול התור, לשלוף משימות, לבצע אותן ולהחזיר תוצאות. היום ב-WEB ניתן בצד הלקוח להאזין ל-DB ולקבל תשובות בצורה אסינכרונית.



MrSus 25.12.1122:36
15. נשמע מאד מעניין בתגובה להודעה מספר 14
אני רוצה לממש את הרעיון על אובייקט COM שלא יכול להיפתח במקביל.. ולכן אני חייב לעשות שיהיה תור כך שהמשתמש הראשון ייפתח את האוביקט ובנתיים המשתמש השני יחכה לסיום הפעולה של המשתמש הראשון.. מה שהצעת לגביי תור שמנוהל ב DB יכול להיות פתרון מצוין.

בכל מקרה עד שאני אגיע למימוש מלא של הרעיון זה יהיה כנראה רק בסיום שנת הלימודים.. אבל ברמה התאורתית החכמתי! תודה רבה!
העבר לפורום אחר
העבר לפורום:
סיבה:
תגובה חדשה
כותרת:
תוכן:
סמיילים:
הצג
עריכת אשכול
כותרת:
תוכן:
סמיילים:
הצג